机器学习--感知机算法原理、方法及代码实现
1.感知器算法原理
两类线性可分的模式类:,设判别函数为:
。
对样本进行规范化处理,即类样本全部乘以(-1),则有:
感知器算法通过对已知类别的训练样本集的学习,寻找一个满足上式的权向量。
2.算法步骤
(1)选择N个分属于和类的模式样本构成训练样本集{ X1, …, XN }构成增广向量形式,并进行规范化处理。任取权向量初始值W(1),开始迭代。迭代次数k=1。
(2)用全部训练样本进行一轮迭代,计算WT(k)Xi 的值,并修正权向量。分两种情况,更新权向量的值:
若 ,分类器对第 i 个模式做了错误分类,权向量校正为:
,c为整的校正增量。
若 ,分类正确,权向量不变,
。
统一写成:
(3)分析分类结果:只要有一个错误分类,回到(2),直至对所有样本正确分类。
感知器算法是一种赏罚过程:
分类正确时,对权向量“赏”——这里用“不罚”,即权向量不变;
分类错误时,对权向量“罚”——对其修改,向正确的方向转换。
3.代码示例
#感知机算法 import numpy as np import matplotlib.pyplot as plt X0 = np.array([[1,0], [0,1], [2,0], [2,2]]) X1 = np.array([[-1,-1], [-1,0], [-2,-1], [0,-2]]) #将样本数据化为增广向量矩阵 ones = -np.ones((X0.shape[0],1)) X0 = np.hstack((ones,X0)) ones = -np.ones((X1.shape[0],1)) X1 = np.hstack((ones,X1)) #对样本进行规范化处理 X = np.vstack((-X0,X1)) plt.grid() plt.scatter(X0[:,1],X0[:,2],c = 'r',marker='o',s=500) plt.scatter(X1[:,1],X1[:,2],c = 'g',marker='*',s=500) W = np.ones((X.shape[1],1)) flag = True while(flag): flag = False for i in range(len(X)): x = X[i,:].reshape(-1,1) if np.dot(W.T,x)<=0: W = W + x flag = True p1=[-2.0,2.0] p2=[(W[0]+2*W[1])/W[2],(W[0]-2*W[1])/W[2]] plt.plot(p1,p2) plt.show()
输出结果: