统计学习之感知机算法
程序员文章站
2022-05-09 13:16:43
...
感知机的定义
- 二分类线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1或者-1值。
- 举例来说,平面坐标轴上的点有两类,在平面坐标轴画一条直线,把点分为两类。
编码实现
数据集
def loadData():
x=np.array([[1,1],[1,2],[2,2],[3,4],[4,4],[4,3]])
y=np.array([1,1,1,-1,-1,-1])
return x,y
X,Y=loadData()
print(X[Y==1])
plt.scatter(X[Y==1][:,0],X[Y==1][:,1])
plt.scatter(X[Y==-1][:,0],X[Y==-1][:,1])
plt.show()
原始形式
def train(X,Y,iters=50):
w=np.array([0]*X.shape[1])
b=0
eta=1
for i in range(iters):
print("第%d次迭代,w="%i,w,"b=%d"%b)
flag=True
for j in range(X.shape[0]):
x=X[j]
y=Y[j]
if y*(sum(w*x)+b)<=0:
w=w+eta*sum(y*x)
b=b+eta*y
flag=False
break
if flag:
break
return w,b
画出超平面
w,b=train(X,Y)
x1=0
y1=-(w[0]*x1+b)/w[1]
x2=5
y2=-(w[0]*x2+b)/w[1]
plt.scatter(X[Y==1][:,0],X[Y==1][:,1])
plt.scatter(X[Y==-1][:,0],X[Y==-1][:,1])
plt.plot([x1,x2],[y1,y2])
plt.show()
对偶形式
#在这里都采用了np.array,dot是矩阵乘法,*是点乘
def train(X,Y,iters=50):
a=np.array([0]*X.shape[0])
b=0
eta=1
G=np.array([[0]*X.shape[0] for i in range(X.shape[0])])
for i in range(X.shape[0]):
for j in range(X.shape[0]):
#print(np.dot(X[i],X[j].T))
G[i][j]=np.dot(X[i],X[j].T)
print(G)
for i in range(iters):
print("第%d次迭代,a="%i,a,"b=%d"%b)
flag=True
for j in range(X.shape[0]):
x=X[j]
y=Y[j]
res=np.sum(a*Y*G[j])+b
if y*res<=0:
a[j]=a[j]+eta
b=b+eta*y
flag=False
break
if flag:
break
return np.dot(Y*a,X),b
画出超平面
w,b=train(X,Y)
x1=0
y1=-(w[0]*x1+b)/w[1]
x2=5
y2=-(w[0]*x2+b)/w[1]
plt.scatter(X[Y==1][:,0],X[Y==1][:,1])
plt.scatter(X[Y==-1][:,0],X[Y==-1][:,1])
plt.plot([x1,x2],[y1,y2])
plt.show()
上一篇: php是什么语言?
下一篇: day19Java-常用对象IO-递归