为了账号安全,请及时绑定邮箱和手机立即绑定

正在回答

2 回答

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

给你,每个模块自己复制分开下

0 回复 有任何疑惑可以回复我~
#1

zjuPeco 提问者

非常感谢!
2017-05-23 回复 有任何疑惑可以回复我~

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次迭代后得到的权重会更加的准确。


1 回复 有任何疑惑可以回复我~
#1

攻城狮ZSP

不好意思,我改了一下老师的代码,这里的dw是w的梯度,在循环内部进行累加,在每一轮迭代时更新一次。不能每计算一次x,y就进行一次更新. self.W才是真正的权重,这个没有被置零过。
2017-05-24 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

求第3章完整代码

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信