精华内容
下载资源
问答
  • 为什么叫感知机

    千次阅读 2016-05-27 20:33:00
    某天讲关于svm的论文,讲到感知机的时候,老师提了个问题:为什么叫感知机,一下把我问住了,查阅了一些资料,下面写写自己的理解。 感知机是从英文翻译过来的,英文为:perceptron,这个词是专门给感知机新造的...

    [html]

    某天讲关于svm的论文,讲到感知机的时候,老师提了个问题:为什么叫感知机,一下把我问住了,查阅了一些资料,下面写写自己的理解。


    感知机是从英文翻译过来的,英文为:perceptron,这个词是专门给感知机新造的(搜索perceptron只有一个解释就是神经网络中的感知机)。
    根据老美造词儿的习惯,也就是跟意思相近的词做词根在加点词性的后缀。
    percept:感觉,知觉
    perception:感受,知觉,认识,感性认识……

    加了‘自修后缀’tron没有实际意义,所以感知机主要是和感觉,知觉类似的。从神经网络模型的角度看,感知机是最简单的分类模型。
    即从多个感受器接受电信号x_1, x_2,…,x_n,进行处理(加权相加再偏移一点,即判断输入是否在某条直线h=0的一侧),
    发出电信号(在正确的那侧发出1,否则不发信号,可以认为是发出0),和人脑的神经元类似(都是接受信号然后发出指令)所以用perceptron命名还是可以理解的。

    展开全文
  • 感知机

    千次阅读 2014-12-11 11:53:18
    1. 为什么叫感知机 当我第一次看到这个名词的时候 perception,顿时有种很厉害的感觉,但发现它其实只是一个二元的线性分类模型。然后我就在想它和感知机有毛线关系哇。好吧,我只能说它是在1950s由Frank ...

    1.    为什么叫感知机

    当我第一次看到这个名词的时候 perception,顿时有种很厉害的感觉,但发现它其实只是一个二元的线性分类模型。然后我就在想它和感知机有毛线关系哇。好吧,我只能说它是在1950sFrank Rosenblatt第一次引入的一个最简单的单层神经网络模型,它非常厉害的模拟啦人脑的这种分层思考的模型,所以有个厉害的名字——感知机,就是这样。And由于这种非常厉害的模拟,它的模型就画成了如下图的模型。即:每个输入向量乘它们对应的权重得到的加权合计,经过一个激活函数得到最后的输出。

     


     

    2.    感知机的假设:

    从机器学习的角度,对于一个分类器来讲,它的工作就是要学习到输入空间的特征向量(X={x1,x2,x3……xn})到输出空间类标签(Y)的映射关系。而这种映射关系可以想象实在是太多太多了,以至于我们必须在学习这个映射关系之前,提前做一个假设——就是在一个假设的映射空间内,去寻找最适合的映射关系。比如说感知机,它的假设空间就是特征空间中的所有线性分类模型。一个几何上的描述就是,找到一个线性方程 x・w + b =0 ,它对应于特征空间的一个超平面,能够把对应的特征空间分为两部分,位于两部分中的点分别是正负两类。如下图所示。然后我们定义x・w + b>0的实例定义成正类,x・w + b<0 的实例定义为负类。

     

     

    3.    拿什么学,为什么能学

    上一节我们说到,感知机的假设空间是线性的,可是我们拿什么学呀,空手可以套白狼吗,不要想太多,答案当然是数据。我们根据已经分类好的一系列数据实例(xy)(x为特征向量,y为对应的类标签)的集合去学到那个超平面。同志们可能说为什么从已知的数据中靠所谓的方法学到的东西,可以应用于未知数据的预测呢?一个比较直观的解释是,就像抛硬币一样,抛得次数多啦,正方两面的比例会接近11,而我们训练集取的足够的多,它也就能够接近真实的数据分布。

    比如说下图,红色代表1类,绿色代表二类。左图假定是所有数据的散点图,而右图是随机采取的一些点,从图中可以看出,它们之间的数据分布是基本一致的,



         


    所以如果我们能够根据图二中的数据中学到分类模型也就是蓝色那根线,那么它也有很大可能接近真实情况的分类模型。(具体数学上的证明什么的有兴趣的可以看看VC bound的相关知识)当然这里会有些过拟合和欠拟合的问题,这里就不讲啦哈。

     

    4.感知机的学习策略

    我们怎么根据训练集去找到那个分割超平面呢,那个最优分割面的标准是什么?这里介绍一个概念,损失函数。我们会通过最大化或最小化这个损失函数的值来求出那个分割超平面,很直观的一个损失函数就是使得分类错误最少的那个超平面嘛!可是你相当于说啦废话,难不成你能穷举所有的线性模型,然后来看那个模型在训练集上分类错误最少。当然从数学上说这样的损失函数不是参数w,b的连续可导函数,不易优化。所以某人就提出啦用错误分类的点到超平面的距离对于所有误分类的点来说(w xi +b)yi < 0的所以损失函数可以表示为


    (1)


     M为误分类点的集合,然后不考虑W,就是感知机的损失函数了。

    于是感知机学习问题转化为求解损失函数式(1)的最优化问题,最优化的方法是随机梯度下降法。感知机学习算法是误分类驱动的,具体采用随机梯度下降法。首先,任意选取一个超平面w0,b0,然后用梯度下降法不断极小化目标函数式(1)。极小化的过程不是一次使M中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。损失函数L(w,b)的梯度是对w和b求偏导,即:

     

     在机器学习基石课程中给出了一个直观的学习策略,当数据当X是正类,却被误分类啦,说明w*x<0那么wx之间的向量夹角就>90,为啦减小这种影响我们就可以对 w进行更新w = w + yx,同样当数据当X是负类,却被误分类啦,说明w*x>0那么wx之间的向量夹角就<90,为啦减小这种影响我们就可以对 w进行更新w = w + yx。

     

    5.感知机的学习算法

    基本的算法就是随机梯度下降法啦,好啦,直接上代码

    public class PLA {
    	public static void main(String args[])
    	{
    		double[][] data = {{3,3},{4,3},{1,1}};
    		int[] label = {1,1,-1};
    		PLA.solvePLA(data, label);
    		
    	}
    	public static void solvePLA(double[][] data, int[] label)
    	{
    		int dim = data[0].length;
    		double ratio = 1;
    		double w[] = new double[dim + 1];
    		boolean isError = true;
    		int count = 0;
    		while (isError)
    		{
    			isError = false;
    			for (int n = 0; n < data.length; n++)
    			{
    				double sum = w[0];
    				for (int m = 0; m < dim; m++)
    				{
    					sum += w[m + 1] * data[n][m];
    				}
    				int predict = 0;
    				if (sum > 0)
    				{
    					predict = 1;
    				} else if(sum < 0)
    				{
    					predict = -1;
    				}
    				if (predict != label[n])
    				{
    					w[0] = w[0] + label[n]*ratio;
    					for (int i = 0; i < dim; i++)
    					{
    						w[i + 1] = w[i + 1] + label[n] * data[n][i]*ratio;
    					}
    					count++;
    					isError = true;
    					n--;
    				}
    
    			}
    		}
    		System.out.println(count);
    		for(double x : w){
    			System.out.print(x+" ");
    		}
    	}
    }
    


    但这种算法有个问题是,只要数据集线性不可分,那么它就会无限循环下去,为啦解决这种情况,有人就提出啦pocket,基本思想是先在口袋里放一个w,然后再去寻找下一个w,如果找到的w比口袋里的好,就把口袋里丢啦,换成现在的w。具体 代码如下:

    import java.util.Random;
    
    public class PocketPLA {
    	public static void main(String args[])
    	{
    		double[][] data = { { 3, 3 }, { 4, 3 }, { 1, 1 } };
    		int[] label = { 1, 1, -1 };
    		PocketPLA.solve(data, label);
    	}
    
    	public static void solve(double data[][], int[] label)
    	{
    		int rightCount = 0;
    		int pocketRightCount = 0;
    		double[] w = new double[data[0].length + 1];
    		double[] pocketW = new double[data[0].length + 1];
    		Random random = new Random();
    		int maxIter = 1000;
    		double ratio = 1;
    		for (int n = 0; n < maxIter; n++)
    		{
    			int index = random.nextInt(data.length);
    			double sum = 0;
    			sum = +w[0];
    			for (int m = 0; m < data[index].length; m++)
    			{
    				sum += w[m + 1] * data[index][m];
    			}
    			int pre = 0;
    			if (sum > 0)
    			{
    				pre = 1;
    			} else if (sum < 0)
    			{
    				pre = -1;
    			}
    			if (pre == label[index])
    			{
    				rightCount++;
    				if (rightCount > pocketRightCount)
    				{
    					for (int i = 0; i < w.length; i++)
    					{
    						pocketW[i] = w[i];
    					}
    					pocketRightCount = rightCount;
    				}
    
    			} else
    			{
    				w[0] += ratio * label[index];
    				for (int i = 1; i < w.length; i++)
    				{
    					w[i] += ratio * label[index] * data[index][i - 1];
    				}
    				rightCount = 0;
    			}
    
    		}
    		for (double x : w)
    		{
    			System.out.print(x + " ");
    		}
    
    	}
    }
    

    好啦,就讲这么多啦,这是本人研究生第一篇博客,写的不好,不要见怪啦啦。


    展开全文
  • 为什么要写感知机?实际上是为了熟悉theano的使用。真正做起来才发现一个最简单的感知机以前的理解都有问题。我想我还是先列一下为什么在文本分类中不用感知机吧。晚上随意搜到了一个”菜菜的sklearn课堂“,真敢说...

    2d55b282730d4f28832d42d0328ccce7.png

    总觉着没整理好,还是先写吧。为什么要写感知机?实际上是为了熟悉theano的使用。真正做起来才发现一个最简单的感知机以前的理解都有问题。我想我还是先列一下为什么在文本分类中不用感知机吧。晚上随意搜到了一个”菜菜的sklearn课堂“,真敢说呀,为啥实际中不用逻辑回归原因是没人用,逻辑回归的预测结果不是概率。。。大姐,模型预测的就是个条件概率,所以才叫判别模型。逻辑回归的本质是sigmoid函数,大姐,损失函数才是本质吧?概率跟损失函数有关系。。。讲工程的,非数学专业的,最好还是照着经典讲,比如《统计学习方法》,别胡扯八道。工程也讲不明白,极度怀疑这些人看过sklearn源码吗。讲解就跟买东西直播似的。。。

    为什么不用感知机:

    1. 线性分类器(这不是主要原因)
    2. 误分类点驱动的损失函数,训练时,w的初值不同或者误分类点选择顺序不同都会得到不同的分类超平面,这种解不确定的算法无论是文本分类还是其他分类应用都是不能接受的。不过sklearn求解的超平面是固定的,具体计算细节待查看源码。
    3. 只能解决二分类问题,对于多分类问题,只能用one-vs-rest方法。如果类目为千万级的,你的训练千万级的分类模型。

    接下来,按照线性分类模型的必列项列举:

    • 预测函数

    81904e7047a031331e0741266ec35e64.png
    • 损失函数

    81144ac5885618d01e3fdfa521a431c7.png

    从损失函数表达式我们应该看到:

    (1)感知机的训练只受误分类点驱动

    (2)标准感知机中没有正则化罚项来避免过拟合问题

    看到这个损失函数,我要对科大讯飞的那位说,这式子从哪个学的角度来说,都不是均方误差。

    最后,上本篇小文的主要内容,用theano实现感知机

    示例数据依然用《统计学习方法》例2.1

    import numpy as np
    import theano
    import theano.tensor as T
    
    # 绘图模块
    import numpy as np
    from matplotlib import pyplot as plt
    from matplotlib.colors import ListedColormap
    %matplotlib inline
    
    def plot_predict(x, w, b):
            return np.dot(w, x) + b
    
    def plot_decsion_plane(X_data, y_data, w, b):
        # 画决策面
        colors = ['red', 'blue']
        cmap = ListedColormap(colors[:len(np.unique(y_data))])
        x1_min, x1_max = X_data[:, 0].min() - 1, X_data[:, 0].max() + 1
        x2_min, x2_max = X_data[:, 1].min() - 1, X_data[:, 1].max() + 1
        xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, 0.02),np.arange(x2_min, x2_max, 0.02))
        Z = plot_predict(np.array([xx1.ravel(), xx2.ravel()]), w, b)
        Z = Z.reshape(xx1.shape)
        plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
        plt.xlim(xx1.min(), xx1.max())
        plt.ylim(xx2.min(), xx2.max())
    
        # 画样本点
        markers = ('x', 'o')
        for idx, ci in enumerate(np.unique(y_data)):
            plt.scatter(x=X_data[y_data == ci, 0], y=X_data[y_data == ci, 1], alpha=0.8, c=np.atleast_2d(cmap(idx)), 
                        marker=markers[idx], label=ci)
    
        # 画图例
        plt.legend(loc='upper left')
        plt.show()
    
    # 定义训练数据
    X_data = np.array([[3,3],
                  [4,3],
                  [1,1]])
    y_data = np.array([1, 1, -1])
    D = (X_data, y_data)
    
    # 学习速率
    eta0 = 1.0
    # 最大训练迭代次数
    training_steps = 20
    
    # 随机变量生成器
    rng = np.random
    
    # 声明theano符号变量
    x = T.dmatrix("x")
    y = T.dvector("y")
    
    # 随机初始化权重向量w
    # w和偏置变量b都为共享变量,
    # 在训练迭代过程中(updates)能构保存它们的上一次迭代时的值plot_decsion_plane
    w = theano.shared(rng.randn(D[0].shape[1]), name="w")
    # 初始化偏置项
    b = theano.shared(0., name="b")
    
    print("初始化模型")
    print("w=", w.get_value(), end=" ")
    print("b=", b.get_value())
    
    
    # 创建theano表达式图
    p_1 = T.dot(x, w) + b                                               # 感知机预测概率公式
    prediction = T.sgn(p_1)                                             # 感知机预测阈值
    cost = -T.sum(T.dot(T.cast(T.neq(y,prediction), 'float32'),y*p_1))  # 错误分类实例驱动
    gw, gb = T.grad(cost, [w, b])                                       # 计算损失函数梯度
    
    
    # 编译
    train = theano.function(
              inputs=[x,y],
              outputs=[prediction, cost],
              updates=((w, w - eta0 * gw), (b, b - eta0 * gb))) # 学习效率为1
    predict = theano.function(inputs=[x], outputs=prediction)
    
    # 训练
    for i in range(training_steps):
        pred, cost = train(D[0], D[1])
        print("iter %d"%i)
        print("w=", w.get_value(), end=" ")
        print("b=", b.get_value(), end=" ")
        print("cost=%f" % cost)
    
    # 画决策面
    plot_decsion_plane(X_data, y_data, w.get_value(), b.get_value())

    分类超平面

    99579c62de012e30eea573a72d62d173.png

    关于感知机,我想应该记住

    1. 它的本质是最小化误分类点数量,从而最小化误分类点到超片面的距离。
    2. 所有线性分类模型的预测表达式中都有wx+b这个线性表达式,在感知机和支持向量机中用wx+b=0的超平面做分类模型的几何解释。
    3. 文本分类中不用感知机的最主要原因应该是它求解出的超平面的不确定性。

    真心希望,有大牛来拍砖,而不是胡扯八道。

    展开全文
  • 感知机及Python实现

    2019-09-23 13:30:55
      什么叫感知机呢?   在李航老师《统计学习方法》中是这么讲的:“感知机(perception)是二类分类的线性分类模型,其输入实例的特征向量,输出实例的类别,取+1和-1二值。”   从定义我们可以看出,感知...

    本文将讲解感知机的原理以及笔者使用Python语言对其的实现:

    感知机原理

      什么叫感知机呢?
      在李航老师《统计学习方法》中是这么讲的:“感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。”
      从定义我们可以看出,感知机其实就是能够实现一个二分类问题的表达式或函数。关于二分类问题,是指问题只可以被分为两类的问题,比如人类从性别上分可分为男性和女性,就是一个典型的二分类问题,还有只有黑球和白球的分类等等。那这样的问题如何让机器去实现呢?当然还得从数学上去考虑,如果我们把正确的分类标记为+1,错误的分类标为-1的话,只需要找到一个满足条件的函数去实现它就可以了。
      符号函数(一般用sign(x)表示)是很有用的一类函数,其表达式为:

    {sign(x)=1,x>0sign(x)=0,x=0sign(x)=1,x<0\left\{ \begin{array}{l}sign(x) = 1,x > 0\\sign(x) = 0,x = 0\\sign(x) = - 1,x < 0\end{array} \right.

      函数图像为:
    sign
      即:当符号函数的自变量值大于0时其结果为1,自变量值小于0时其结果为-1,自变量等于0时值为0。那么,对于一个二分类问题,我们就可以利用符号函数的性质来解决我们的实际问题。下图坐标系中的方框和圆形就可以作为一个二分类的问题,当然,其分法有n多种,笔者画出了四种分法,哪一种最好呢?红线的分法应该是较为理想的,因为从目前方框和圆形的分布趋势我们有理由相信:即使有更多的方框或者圆形出现,按目前的趋势来讲红线依然有可能正确地分类,而其他颜色的线条则不然。

      那么,在坐标系中,我们将这些方框和圆圈可以表示为实际的坐标{(x1,y1),(x2,y2),...,(xn,yn)}\{ ({x_1},{y_1}),({x_2},{y_2}),...,({x_n},{y_n})\},则我们的问题依然是去找一个这样的线(我们称满足这条线的方程为超平面),使得能够将这些属于二类的坐标点被正确地分类。这条线的表达式正是我们想要的,也就是我们所讲的感知机。为了确定这样的感知机,我们需要确定一个学习策略,并定义一个损失函数使得该损失函数极小化。损失函数一般的选择方式是误分类点的总数,然而在选择感知机的过程中误分类点的总数不能直观地去改进我们的超平面,因此不能被很好地利用以改进我们的感知机。
      那么我们还得从感知机本身出发去考虑:
      从前面的讲解我们可以知道,感知机其实是一个线性方程,在二维平面坐标系中我们可以将其表示为
    Ax+By+C=0Ax + By + C = 0
      对于该方程,二维平面上任意一点P(x0,y0)P(x_0,y_0)到任意一条直线Ax+By+C=0Ax + By + C = 0的距离可以表示为:
    d=Ax0+By0+CA2+B2d = \frac{{A{x_0} + B{y_0} + C}}{{\sqrt {{A^2} + {B^2}} }}
      那么我们可以选择将误分类的点到超平面的总距离作为损失函数。如果我们用wx+b=0w \cdot x+b=0表示Ax+By+C=0Ax + By + C = 0,那么我们分类问题中输入空间Rn\mathop R\nolimits^n中任意一点x0x_0到超平面的距离为数学中我们知道平面直角坐标系内任意一点到任意一条直线之间的距离可公式为:
    1wwx0+b\frac{1}{{||w||}}|w \cdot {x_0} + b|
    其中w||w||wwL2L_2范数。
      对于误分类点来说,yi(wxi+b)>0- {y_i}(w \cdot {x_i} + b) > 0,因为误分类时,wxi+b>0w \cdot {x_i} + b>0%uFF0C- {y_i}=-1,我们最初的定义误分类标记为1-1。【注意,这里的yiy_iAx+By+C=0Ax+By+C=0中的yiy_i不是一回事,这里yiy_i表示点的分类标记。在我们用wx+b=0w⋅x+b=0表示Ax+By+C=0Ax+By+C=0时进行了一定的转换,即:w=(w(1),w(2))Tw = {({w^{(1)}},{w^{(2)}})^T}x=(x(1),x(2))Tx = {({x^{(1)}},{x^{(2)}})^T},那么,wx+b=w(1)x(1)+w(2)x(2)+bw\cdot x+b={w^{(1)}}{x^{(1)}} + {w^{(2)}}{x^{(2)}} + b,也就是我们用w(1),w(2),x(1),x(2),b{w^{(1)}},{w^{(2)}},{x^{(1)}},{x^{(2)}},b分别表示了方程Ax+By+C=0Ax+By+C=0中的A,B,x,y,CA,B,x,y,C
      如果假设超平面SS的误分类点集合为MM,那么所有误分类点到超平面SS的总距离为
    1wxiMyi(wxi+b)- \frac{1}{{||w||}}\sum\limits_{{x_i} \in M} {{y_i}(w \cdot {x_i} + b)}
    方程给定后,ww的值是一定的,那么我们可以不考虑1w- \frac{1}{{||w||}},直接将xiMyi(wxi+b)\sum\limits_{{x_i} \in M} {{y_i}(w \cdot {x_i} + b)}作为感知机学习的损失函数。即给定训练集 T={(x1,y1),(x2,y2),...,(xn,yn)}T=\{ ({x_1},{y_1}),({x_2},{y_2}),...,({x_n},{y_n})\},感知机的损失函数为:
    L(w,b)=xiMyi(wxi+b)L(w,b) = - \sum\limits_{{x_i} \in M} {{y_i}(w \cdot {x_i} + b)}
    从表达式我们可以看出,损失函数的值非负的。如果没有误分类点,其值为00,在误分类时,损失函数是参数w,bw,b的线性函数,则损失函数L(w,b)L(w,b)w,bw,b的连续可导函数。
      连续可导有什么用呢?回到最初的问题,我们的目标是求一个感知机,也就是能够将平面上的点正确二分类的方程wx+b=0w \cdot x + b = 0,在有误分类的情况发生时,不断修改wwbb的值使得误分类的点越来越少,也就是让损失函数的值越来越小直至为00。由于损失函数是关于w,bw,b连续可导的,其导数为:
    wL(w,b)=xiMyixi{\nabla _w}L(w,b) = - \sum\limits_{{x_i} \in M} {{y_i} \cdot {x_i}}
    bL(w,b)=xiMyi{\nabla _b}L(w,b) = - \sum\limits_{{x_i} \in M} {{y_i}}

      对于wwbb的修改,我们可以随机选取一个误分类点(xi,yi)(x_i,y_i),对w,bw,b进行更新:
    ww+ηyixiw \leftarrow w + \eta {y_i}{x_i}
    bb+ηyib \leftarrow b + \eta {y_i}

      式中η(0<η1)\eta (0 < \eta \le 1)是步长,又称为学习率(learning rate)。这样就可以通过不断跌代从而修改wwbb的值使得损失函数不断减小直至为00
      可以看出,感知机学习的算法是误分类驱动的,在我们修改w,bw,b随机选取了一个点进行更新,我们将这个方法叫随机梯度下降法(stochastic gradient descent)。综上,感知机学习算法可以如下表示:
    输入: 训练数据集T={(x1,y1),(x2,y2),...,(xn,yn)}T = \{ ({x_1},{y_1}),({x_2},{y_2}),...,({x_n},{y_n})\},其中,xiRn,yi{1,+1},i=1,2,,n;{x_i} \in {R^n},{y_i} \in \{ - 1, + 1\} ,i = 1,2, \cdots ,n;η(0<η1)\eta (0 < \eta \le 1)
    输出: w,bw,b,感知机模型f(x)=sign(wx+b)f(x) = sign(w \cdot x + b)

    1. 选取初值w0,b0w_0,b_0
    2. 在训练集中选取数据(xi,yi)(x_i,y_i)
    3. 如果yi(wxi+b)0{y_i}(w \cdot {x_i} + b) \le 0
      ww+ηyixibb+ηyi\begin{array}{l} w \leftarrow w + \eta {y_i}{x_i}\\ b \leftarrow b + \eta {y_i} \end{array}
    4. 转至2.,直至训练集中没有误分类的点。

    以上就是我们感知机的原理部分,接下来,我们将使用Python语言将其实现:

    感知机的Python实现

    话不多说,直接上python代码:

    #   -*- encoding:utf-8 -*-
    #   The entire code is used to implement the perceptron
    """
    Created on Tuesday, 24 December 14:58 2019
    @author:Jeaten
    @email:ljt_IT@163.com
    """
    import numpy as np
    import random
    def data():
        '''
       该函数用于产生训练数据
        :return: 返回特征和标签
        '''
        train = [((3, 3), 1), ((4, 3), 1), ((1, 1), -1)]#((x,y),c):(x,y)为数据的坐标,c为所属类别
        feature=[]
        label=[]
        for i in train:
            feature.append(i[0])
            label.append(i[1])
        feature=np.array(feature)
        label=np.array(label)
        return feature,label
    class perceptron:
        def __init__(self):
            '''
             :param w:感知机的权重
             :param b:感知机的偏置
             :param learning_rate:学习率
            '''
            self.w = np.array([0,0])
            self.b=0
            self.learning_rate=1
        def update(self,w,x,y,b):
            '''
            该函数用于参数的更新
            :param w: 权重
            :param x: 数据的特征
            :param y: 数据的标签
            :param b: 数据的偏置
            :return: 无
            '''
            self.w=w+self.learning_rate*x*y
            self.b=b+self.learning_rate*y
        def sign(self,w,x,b):
            '''
            该部分为符号函数
            :return 返回计算后的符号函数的值
            '''
            return np.sign(np.dot(w,x)+b)
        def train(self,feature,label):
            '''
            该函数用于训练感知机
            :param feature: 特征
            :param label: 标签(数据点所属类别)
            :return: 返回最终训练好模型(参数)
            '''
            stop=True
            while stop:
                count=len(feature)
                for i in range(len(feature)):
                    if self.sign(self.w,feature[i],self.b)*label[i]<=0:
                        print( "分类错误!误分类点为:", feature[i] )
                        self.update( self.w, feature[i], label[i], self.b )
                    else:
                        count -= 1
                    if count == 0:
                        stop = False
            print( "最终权重 w:", self.w, "最终偏置 b:", self.b )
            return self.w,self.b
        def train_rand(self,feature,label):
            '''
            该函数使用随机选择数据点来进行训练(随机梯度下降法)
            :param feature: 特征
            :param label: 标签(数据点所属类别)
            :return: 返回最终训练好模型(参数)
            '''
            stop=True
            while stop:
                count=len(feature)
                index=[i for i in range(len(feature))]
                random.shuffle(index)
                for i in index:
                    if self.sign(self.w,feature[i],self.b)*label[i]<=0:
                        print( "分类错误!误分类点为:",feature[i])
                        self.update(self.w,feature[i],label[i],self.b)
                    else:
                        count-=1
                if count==0:
                    stop=False
            print("最终w:",self.w,"最终b:",self.b)
            return self.w,self.b
    class show:
        def draw_curve(self, data,w,b):
            '''
            该函数应用于查看拟合效果
            :param data: 数据点
            :param w: 权重
            :param b: 偏置
            :return: 无
            '''
            import matplotlib.pyplot as plt
            coordinate_x=[]
            for i in data:
                coordinate_x.append(i[0])
            coordinate_y=[]
            for i in range(len(data)):
                coordinate_x.append(data[i][0])
                coordinate_y.append(data[i][1])
                if label[i]==1:
                    plt.plot(data[i][0], data[i][1],'o'+'r',label='right',ms=10)
                else:
                    plt.plot(data[i][0], data[i][1],'*'+'g',label='error',ms=10 )
            d_x=np.arange(0,max(coordinate_x),1)
            d_y=[]
            for i in d_x:
                d_y.append(-(w[0]*i+b)/w[1]) #一定的学习率下可能会有除0错误
            plt.plot(d_x,d_y,)
            plt.show()
            return True
    if __name__ == '__main__':
        feature,label=data()
        x=np.array(feature)
        y=np.array(label)
        neuron=perceptron()
        show=show()
        w, b = neuron.train( x, y )#按序调整
        # w,b=neuron.train_rand(x,y)#使用随机梯度下降法
        show.draw_curve( data()[0], w,b )
    

    首先让我们跑一下看看效果,得到权重为w=[1 1],偏置为b=-3,其结果如下图所示:
    result
    可以看出此超平面实现了对点的二分类,当然,我们可以使用随机梯度下降方法来进行分类,得到的一种结果为w=[2 1],b=-5,其结果图如下:
    result_
    接下来,我们构造一个二分类的数据集来看看分类的效果,构造数据集的时候可将产生数据集的“train=”部分用以下或别的函数代替。笔者使用了随机产生1000个数的方法,产生代码如下:

    import random
    data = []
    for i in range( 1000 ):
        x = random.randint( 0, 50 )
        y = random.randint( 0, 50 )
        if x > y:
            data.append( ((x, y), 1) )
        elif x < y:
            data.append( ((x, y), -1) )
    train=data
    

    产生方法如下:
    在这里插入图片描述
    我们使用随机梯度下降的方法进行二分类,得到一组参数为:w=[72 -72],b=-1,分类结果如下图所示:
    在这里插入图片描述
    可以看出分类效果还是很不错的。
    以上就是本期的感知机的原理和python的代码实现,欢迎交流批评指正!

    创作不易,觉得写得不错就微信扫码奖励一下吧!

    Reward

    展开全文
  • 感知机是个相当简单的模型,但它既可以发展成支持向量机(通过简单地修改一下损失函数)、又可以发展成神经网络(通过简单地堆叠),所以它也拥有一定的地位 方便,我们统一讨论二分类问题,并将两个类别的样本...
  • 我觉得是深受工业革命的影响,把一些可以实现功能的基本单元都喜欢叫做什么机,这里的感知机,还有后来的以感知机为基础的支持向量机。直接看定义,看本质,实际上,感知机是一种线性分类模型。下面就以这句话中心...
  • 感知机是二分类的线性分类模型,必须是线性可分的,其输入实例的特征向量,输出实例的类别(+1,-1) 什么叫线性可分?在二维平面上、线性可分意味着能用一条线将正负样本分开,在三维空间中、线性可分意味着能...
  • 6. 多层感知机与分类器逻辑回归交叉熵 逻辑回归 对于逻辑回归我们不能直接最大化 accuracy。...为什么叫 regression。 • MSE−− >regression. • cross entropy−− >classification. 多类: • 实...
  • - 为什么说通过感知机算法的推导和实践便迈进了机器学习的大门? - 感知机算法的学习策略是怎样的? - 不同感知机算法之间的真正区别是什么? - 关于感知机算法都有哪些损失函数和权重更新的形式? - 为什么需要对...
  • 感知机是神经网络(深度学习)的起源算法,要弄懂神经网络,首先要搞清楚什么感知机 2.1感知机 图1: 两个输入的感知机 感知机中有两个输入信号,一个输出信号。输入的信号分别于其权重相乘再求和(x1w1+x2w2...
  • SVM(一) 感知机感知机是个相当简单的模型,但它既可以发展成支持向量机(通过简单地修改一下损失函数)、又可以发展成神经网络(通过简单地堆叠),所以它也拥有一定的地位。方便,我们统一讨论二分类问题,并将两...
  • 线性回归 知识点 1. 数据集名词 training set sample label feature ...为什么单个要除以 2 ? 其实标准的也可以不 / 2 为什么均方差用的这么多? 好处坏处, 别的? 均方差 MSE, mean squared error, RM...
  • 感知机中有一种逻辑电流异或门,含义在此不做过多的阐述,有兴趣的话,我后面可以做一篇关于感知机的介绍。但我找了一下关于感知机的输入与输出关系,如下图 在坐标系中表示出来就是 一条直线是不能将两个类别...
  • *本文来自花粉俱乐部@官方产品维护荣耀V20上有很多传感器,其中有一个接近光传感器,可能有花粉朋友还不知道它的用途,今天给大家讲一讲。接近光传感器的作用在于:接听电话或微信语音聊天时,接近光传感器可以...
  • 为什么会晕车?

    2019-05-06 16:45:51
    为什么会晕车? 原因: 每个人的耳朵里面都有一个前庭的结构,它可以感知我们身体的运动状态,帮助我们维持身体的平衡,在我们坐车的时候,车辆的车辆的停止转弯都能被我们的前庭感知到,但眼睛看到的往往是一个...
  • 支持向量(SVM)

    2018-11-14 15:51:00
    2.SVM为什么采用间隔最大化: 1.当训练数据可分的时候,存在很多超平面可以将数据分开 2.感知机利用误分类最小策略,求得分离超平面,不过此时的解有无穷多个。 3.线性可分支持向量机利用间隔最大化求得最优...
  • ​ 在说这个事情之前,咱们先来聊一聊语音助手,现在更多的人会它“语音 AI 助手”或者“智能语音助手”。这里面没有什么天花乱坠的黑科技,只有实打实的落地产品、关联生态和实际的用户体验。落地产品有三个要素...
  • 神经网络中将输入信号的总和转换输出信号的函数,激活函数将多层感知机输出转换非线性,使得神经网络可以任意逼近任何非线性函数,使神经网络可以应用到众多的非线性模型中。 常用的激活函数及特点: 1)sigmoid...
  • 机器学习SVM算法常见面试题(一)

    千次阅读 2020-05-29 09:54:08
    在面试数据分析或算法相关岗位时,支持向量机是常被问...4 SVM与感知机的区别?5 什么叫支持向量?6 支持向量机包含几种模型?7 SVM怎么处理多分类?8 核函数原理?9 为什么引入核函数?10 SVM有哪些核函数,对应有...
  • 1、在第2章 感知机 中:①、为什么叫超平面:分割平面:在三维XYZ坐标系里,XoY平面把三维坐标系“分割”成两个空间,XoY平面就是一个分割平面。分割平面可以推广到一维、二维、四维......维空间中,此时把分割平面...
  • 就是说为什么我们安装了杀毒软件,依然会受到病毒的侵犯,为什么有些病毒总杀杀不干净,那么这个问题实际上是困扰我们杀毒软件行业一个很长时间的东西,以前我们往往会看杀毒软件是不是最新版本,是不是用的最新的...
  • Python3 网络爬虫(三):漫画下载,动态加载、反爬虫这都不事! Python3 网络爬虫(四):视频下载,那些事儿! Python3 网络爬虫(五):老板,需要特殊服务吗? Python3 网络爬虫(六):618,爱他/她,就清空...
  • Python3 网络爬虫(三):漫画下载,动态加载、反爬虫这都不事! Python3 网络爬虫(四):视频下载,那些事儿! Python3 网络爬虫(五):老板,需要特殊服务吗? Python3 网络爬虫(六):618,爱他/她,就清空...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    问:为什么传统音乐程序不好? 答: 传统音乐程序功能单一,容易令人感到枯燥无味,没有吸引力; 传统音乐程序强调单方向,用户没有参与感; 传统音乐程序设计不够灵活,扩展性差。 项目背景--钢琴练奏师 问:...

空空如也

空空如也

1 2
收藏数 33
精华内容 13
关键字:

为什么叫感知机