什么是感知器?生物神经元示意图感知器的概念类似于神经元(大脑的基本处理单元)的工作方式。一个神经元由树突携带的许多输入信号、一个细胞体和一个由轴突携带的输出信号组成。当一个细胞达到某个阈值时,神经元就会发出一个信号来采取行动。此操作要么发生,要么不发生。类似地,感知器有许多输入(通常称为特征),这些输入被馈送到产生二进制输出的线性单元。因此,感知器可用于解决二元分类问题,其中样本将被识别为属于两个预定义类别之一。算法感知器示意图由于感知器是二元分类器(0/1),我们可以将它们的计算定义如下:让我们回想一下,两个长度为n的向量的点积由函数f(x)=b+w.x给出权重和特征向量的线性组合。因此,感知器是一种线性分类器——一种使用线性预测函数进行预测的算法。权重表示x中每个特征x?对机器学习模型行为的有效性。特征x?的权重w?越高,它对输出的影响就越大。偏差“b”类似于线性方程中的截距,它是一个常量,有助于机器学习模型以最适合数据的方式进行调整。偏置项假定虚拟输入特征系数x?=1。可以使用以下算法训练模型:Python实现我们考虑用于实现感知器的机器学习数据集是鸢尾花数据集。该数据集包含4个特征,用于描述花朵并将它们分类为属于3个类别之一。我们剥离了属于“Iris-virginica”类的数据集的最后50行,仅使用了两个类“Iris-setosa”和“Iris-versicolor”,因为这些类是线性可分的,所以该算法会找到最佳的收敛权重到局部最小值。importnumpyasnpimportpandasasspdimportmatplotlib.pyplotaspltdefload_data():URL_='https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'data=pd.read_csv(URL_,header=None)print(数据)#makethedatasetlinearlyseparabledata=data[:100]data[4]=np.where(data.iloc[:,-1]=='Iris-setosa',0,1)data=np.asmatrix(data,dtype='float64')returndatadata=load_data()可视化一个具有两个特征的数据集,我们可以看到通过在它们之间画一条直线,数据集被清楚地分开了。我们的目标是编写一个算法来找到这条线并对所有这些数据点进行正确分类。plt.scatter(np.array(data[:50,0]),np.array(data[:50,2]),marker='o',label='setosa')plt.scatter(np.array(data[50:,0]),np.array(data[50:,2]),marker='x',label='versicolor')plt.xlabel('花瓣长度')plt.ylabel('sepallength')plt.legend()plt.show()现在我们实现上面提到的算法,看看它是如何工作的。我们有4个特征,所以每个特征有4个权重。请记住,我们定义了一个偏差项w?,假设x?=1,因此它总共有5个权重。我们将迭代次数定义为10。这是超参数之一。在每次迭代中,该算法都会为所有数据点计算类别(0或1),并在每次错误分类时更新权重。如果样本被错误分类,权重将通过向相反方向移动的增量来更新。所以如果再对样本进行分类,结果就会“少错”。我们将任何≤0的标签分类为“0”(Iris-setosa),将其他标签分类为“1”(Iris-versicolor)。defperceptron(data,num_iter):features=data[:,:-1]labels=data[:,-1]#setweightstozerow=np.zeros(shape=(1,features.shape[1]+1))misclassified_=[]forepochinrange(num_iter):misclassified=0forx,labelinzip(features,labels):x=np.insert(x,0,1)y=np.dot(w,x.transpose())target=1.0if(y>0)else0.0delta=(label.item(0,0)-target)if(delta):#misclassifiedmisclassified+=1w+=(delta*x)misclassified_.append(misclassified)return(w,misclassified_)num_iter=10w,misclassified_=perceptron(data,num_iter)现在,让我们绘制每次迭代中错误分类样本的数量。我们可以看到算法在第4次迭代时收敛。也就是说,所有样本在第4次遍历数据时都被正确分类。感知器的一个特性是,如果数据集是线性可分的,算法一定会收敛!epochs=np.arange(1,num_iter+1)plt.plot(epochs,misclassified_)plt.xlabel('iterations')plt.ylabel('misclassified')plt.show()局限性数据集是线性可分的。该算法仅用于二元分类问题。然而,我们可以通过在每个类中引入一个感知器来扩展该算法来解决多类分类问题。
