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

缺少的那一节

我用的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


正在回答

1 回答

我也用的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()是做点积


2 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

缺少的那一节

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