求第3章完整代码
如题,万分感谢分享。
如题,万分感谢分享。
2017-05-16
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次迭代后得到的权重会更加的准确。
举报