用python实现简单感知机算法

之前有写过一篇关于感知机的理论篇,这算是实践篇,自己看了网上的视频后实现了一遍,具体代码仅供参考:
一、创建感知机类

import numpy as np
class perceptron():
    '''eta:学习率 n_iter:权重向量的训练次数 w_:神经分叉权重向量 errors:用于记录神经元判断出错次数'''

    def __init__(self,eta=0.01,n_iter=10):
        self.eta=eta
        self.n_iter=n_iter
        pass

    def fit(self,X,y):
        '''输入训练数据,培训神经元,x输入样本向量,y对应样本分类'''

        '''初始化权重向量为0 加一是因为算法提到的w0,也就是步调函数阈值'''

        self.w_=np.zero(1+X.shape[1])
        self.errors_=[]

        for _ in range(self.n_iter):
            errors=0
            '''X:[[1,2,3],[4,5,6]] y:[1,-1] zip(X,y)=[[1,2,3,1],[4,5,6,-1]] '''
            for xi,target in zip(X,y):
                '''update=n*(y-y')'''
                update=self.eta*(target-self.predict(xi))
                self.w_[1:]+=update*xi
                self.w_[0]+=update
                errors+=int(update!=0.0)
                self.errors_.append(errors)
                pass

            pass

    def net_input(self,X):
            '''z=w0*1+x1*x1+...wn*xn'''
            return np.dot(X,self.w_[1:])+self.w_[0]
            pass

    def predict(self,X):
            return np.where(self.net_input(X)>=0.0,1,-1)
            pass

    pass

二、导入数据

file = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
import pandas as pd
df=pd.read_csv(file,header=None)

三、可视化展示

import matplotlib.pyplot as plt
import numpy as np

y=df.loc[0:100,4].values
y=np.where(y=='Iris-setosa',-1,1)
X=df.loc[0:100,[0,2]].values

plt.scatter(X[:50,0],X[:50,1],color='red',marker='o',label='setosa')
plt.scatter(X[50:100,0],X[50:100,1],color='blue',marker='x',label='versicolor')
plt.xlabel('花瓣长度')
plt.ylabel('花径长度')
plt.legend(loc='upper left')
plt.show()

ppn=Perceptron(eta=0.1,n_iter=10)
ppn.fit(X,y)



from matplotlib.colors import ListedColormap
def plot_decision_regions(X,y,classifier,resolution=0.02):
    marker=('a','x','o','v')
    colors=('red','blue','lightgreen','gray','cyan')
    cmap=ListedColormap(colors[:len(np.unique(y))])

    x1_min,x1_max=X[:,0].min()-1,X[:,0].max()
    x2_min,x2_max=X[:,1].min()-1,X[:,1].max()


    Z=classifier.predict(np.array([xx1.ravel(),xx2.ravel()]).T)
    print(xx1.ravel())
    print(xx2.ravel())


plot_decision_regions(X,y,ppn,resolution=0.02)
plt.xlabel('花瓣长度')
plt.ylabel('花径长度')
plt.legend(loc='upper left')
plt.show()
    print(Z)

    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())

    for idx, cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y==cl, 0],y=X[y==cl, 1],alpha=0.8,c=cmap(idx),label=cl)

点赞