如题,万分感谢分享。
import numpy as np class Perceptron(object): def __init__(self, eta=0.01, n_iter=10): self.eta=eta self.n_iter=n_iter pass def fit(self,X,y): self.W=np.zeros(1+X.shape[1]) self.errors=[] for _ in range(self.n_iter): error=0 dw=np.zeros(1+X.shape[1]) for xi,target in zip(X,y): update=self.eta*(target-self.predict(xi)) dw[1:]+=update*xi dw[0]+=update error+=int(update!=0) pass self.W+=dw self.errors.append(error) pass pass def net_input(self,xi): return np.dot(self.W[1:],xi)+self.W[0] def predict(self,xi): return np.where(self.net_input(xi)>0,1,-1) pass #文件读取 file="D:/python/nn/data.csv" import pandas as pd df=pd.read_csv(file,header=None) df.head(10) #显示原始数据 import matplotlib.pyplot as plt import numpy as np y=df.loc[0:99,4].values y=np.where(y=='Iris-setosa',-1,1) X=df.iloc[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(u'花瓣长度') plt.ylabel(u'花径长度') plt.legend(loc='upper left') #plt.show() #训练并打印错误曲线 ppn=Perceptron(0.1,20) ppn.fit(X,y) print (ppn.W) plt.scatter(range(1,len(ppn.errors)+1),ppn.errors,color='red',marker='o') #plt.show() #定义打印分类器边界函数 from matplotlib.colors import ListedColormap def plot_decision_regions(X,y,classifier,resolution=0.02): markers=('s','x','o','v') colors=('lightgreen','gray','cyan','red','blue') 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() print(x1_min,x1_max) print(x2_min,x2_max) xx1,xx2=np.meshgrid(np.arange(x1_min,x1_max,resolution), np.arange(x2_min,x2_max,resolution) ) #print(xx2.shape) #print(xx2) z=classifier.predict(np.array([xx1.ravel(),xx2.ravel()])) #print(xx1.ravel()) #print(xx2.ravel()) #print(z) z=z.reshape(xx1.shape) plt.contourf(xx1,xx2,z,alpha=0.8,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),marker=markers[idx],label=cl) #打印边界及原始数据 plot_decision_regions(X,y,ppn) plt.xlabel(u'花瓣长度') plt.ylabel(u'花径长度') plt.legend(loc='upper left') plt.show()
给你,每个模块自己复制分开下
for _ in range(self.n_iter):
error=0
dw=np.zeros(1+X.shape[1])
for xi,target in zip(X,y):
update=self.eta*(target-self.predict(xi))
dw[1:]+=update*xi
dw[0]+=update
error+=int(update!=0)
pass
self.W+=dw
self.errors.append(error)
这段代码中,在进行10次迭代的过程中,每次迭代的时候都把权重重新置为 0 。
我觉得有点问题。(下划线部分)
如果每次迭代都 从新 将权重置为0,那么每次迭代都是一样的,是没有意义的。
如果每次迭代后 权重 被带到下一次循环中,那么在经过10次迭代后得到的权重会更加的准确。