欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

统计学习之感知机算法

程序员文章站 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()

统计学习之感知机算法