代码运行有误,大神们帮忙看看

来源:3-4 神经网络对数据实现分类(上)

LukeSkywalker

2018-07-21 21:33

老师好,运行代码时显示构造类传参有误,哪里错了呢?

####### 算法代码 #######

import numpy as np

class Perceptron(object):

    """

    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对应样本分类

        

        X:shape[n_samples, n_feateures]

        X:[1, 2, 3], [4, 5, 6]

        n_samples: 2

        n_features: 3

        

        y:[1, -1]

        """

        """

        初始化权重向量为0

        加一是因为前面算法提到的w0,也就是步调函数阈值

        """

        self.w_ = np.zeros(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 = η * (y - y')

                """

                update = self.eta * (target - self.predict(xi))

                """

                xi是一个向量

                update * xi 等价:

                [Δw(1) = X[1]*update, Δw(2) = X[2]*update, Δw(3) = X[3]*update]

                

                """

                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 + W1*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


####### 图形化代码 #######

import matplotlib.pyplot as plt

import numpy as np

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

plt.rcParams['axes.unicode_minus']=False #用来正常显示负号


# 取出0到100行第四列

y = df.loc[0:100, 4].values

y = np.where(y == 'Iris-setosa', -1, 1)


# 抽取前100条数据的第0列和第2列

X = df.iloc[0:100, [0, 2]].values


# 前50条数据第0列当作x坐标,前50条数据第1列当作y坐标

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)

plt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker='o')

plt.xlabel('Epochs')

plt.ylabel('错误分类次数')

plt.show()


上面代码运行时报错,Perceptron类中申明了predict方法,为什么报没有predict属性呢:

<ipython-input-98-9ba268a8ffae> in fit(self, X, y)

     40                 update = η * (y - y')

     41                 """

---> 42                 update = self.eta * (target - self.predict(xi))

     43                 """

     44                 xi是一个向量


AttributeError: 'Perceptron' object has no attribute 'predict'


写回答 关注

1回答

  • 严伟安
    2018-08-06 14:09:32

    需要把def net_input()和def predict()两个函数放到def fit()函数的前面

    原因:代码好像是从上往下解释的,执行到fit函数式,程序还不知道有net_input和predict这两个函数

机器学习-实现简单神经网络

人工智能时代,你准备好成为抓住机遇的那百分之二吗。

66868 学习 · 182 问题

查看课程

相似问题