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