问答详情
源自:-

求第3章完整代码

如题,万分感谢分享。

提问者:zjuPeco 2017-05-16 14:53

个回答

  • 攻城狮ZSP
    2017-05-18 22:55:23
    已采纳

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

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

  • 只是疯狂只是野
    2017-05-21 18:16:41

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