问答详情
源自:3-5 神经网络对数据实现分类(下)

缺少的那一节

我用的python3.7,调整了视频中的错误,函数的位置和命名问题,但是出现TypeError: can't multiply sequence by non-int of type 'float'这个错误,python3中不能这么写吗,以下为我的感知器类代码

import numpy as np
class Perception(object):
    '''
    eta:学习率
    n_iter:权重向量的训练次数
    w_:神经分叉权重向量
    error_:记录神经元判断出错次数
    '''
    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_features)
        n_samples:样本量
        n_feature:神经元分叉数量
        例:x:[[1,2,3],[4,5,6]]
        n_samples:2
        n_feature:3
        y:[1,-1]
        '''
        '''
        初始化权重向量为0
        加一是因为将前面算法提到的w0,也就是步调函数阈值
        w_:权重向量
        error_:错误记录向量
        '''
        self.errors_ = []
        self.w_ = np.zeros(1 + x.shape[1])
        for _ in range(self.n_iter):
            errors = 0
            for xi,target in zip(x,y):
                '''
                zip(x,y):[[1,2,3,1],[4,5,6,-1]]
                '''
                update = (self.eta) * (target - self.predict(xi))
                self.w_[1:] += update * xi
                self.w_[0] += update
                '''
                ▽w(n) = update * x[n]
                '''
                errors += int(update != 0.0)
                self.errors_.append(errors)
                pass
            pass
    def net_input(self,x):
        '''
        z = w0 * 1 + w1 * x1 +... +wn * xn
        '''
        z = np.dot(x,self.w_[1:]) + self.w_[0]
        return z
        pass
    def predict(self,x):
        return np.where(self.net_input(x)>=0.0,1,-1)
        pass


提问者:石明昊 2019-11-20 22:03

个回答

  • Du1in9
    2020-07-20 09:33:11

    我也用的python3.7,这是我的代码,谢谢采纳~

    import numpy as np
    
    class Perceptron(object):
        # 注释1
        def __init__(self, eta = 0.01, n_iter = 10):
            self.eta = eta
            self.n_iter = n_iter
        def fit(self, X, y):
            # 注释2
            self.w_ = np.zeros(1 + X.shape[1])
            self.errors_ = []
            for _ in range(self.n_iter):
                errors = 0
                # 注释3
                for xi, target in zip(X, y):
                    update = self.eta * (target - self.predict(xi))
                    # 注释4
                    self.w_[1:] += update * xi
                    self.w_[0] += update
                    errors += int(update != 0.0)
                    self.errors_.append(errors)
        def net_input(self, X):
            # 注释5
            return np.dot(X, self.w_[1:]) + self.w_[0]
        def predict(self, X):
            return np.where(self.net_input(X) >= 0.0, 1, -1)
    注释1:
        eta:学习率
        n_iter:权重向量的训练次数
        w_:神经分叉权重向量
        errors_:用于记录神经元判断出错次数
    注释2:
        输入训练数据,培训神经元,X是输入样本向量,y是对应的样本分类
        X:shape[n_samples, n_features]
        比如:X:[[1, 2, 3], [4, 5, 6]]
        那么:n_samples: 2,n_features: 3,y:[1, -1]
    
        初始化权重向量为0,加1是因为提到的w0,即步调函数的阈值
    注释3:
        比如:X:[[1, 2, 3], [4, 5, 6]
        所以y:[1, -1],zip(X, y):[[1, 2, 3, 1]. [4, 5, 6, -1]]
    
        update = n * (y - y')
    注释4:
        xi是一个向量
        update * xi等价于:[ w1 = x1*update, w2 = x2*update, ...]
    注释5:
        z = w0*1 + w1*x1 + w2*x2 + ... 
        np.dot()是做点积