用python实现简单感知机算法

来源:互联网 发布:ireport java 编辑:程序博客网 时间:2024/06/09 07:41

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

import numpy as npclass 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 pddf=pd.read_csv(file,header=None)

三、可视化展示

import matplotlib.pyplot as pltimport numpy as npy=df.loc[0:100,4].valuesy=np.where(y=='Iris-setosa',-1,1)X=df.loc[0:100,[0,2]].valuesplt.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 ListedColormapdef 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)
原创粉丝点击