本文共 1711 字,大约阅读时间需要 5 分钟。
学习笔记来源
很喜欢这个图
机器学习就是不断更新权重和阈值的过程感知器算法适用于线性分割
步调函数和阈值
权重向量W,训练样本X 其中W(0)是阈值的取负数,X(0) 初值 1 W(1)….W(x)初值设置为0[公式]Z = w0 * 1 + W1*X1 + ….+ Wn * Xn
# 神经元 def net_input(self, x): ''' [公式]Z = w0 * 1 + W1*X1 + ....+ Wn * Xn ''' return np.dot(x, self.w_[1:]) + self.w_[0] pass
初始化权重向量
-------------------------------------------------- ''' fit 输入训练数据,培训神经元 x 表示 输入样本向量 y 表示样本分类 x:shape[n_samples, n_features] x:[[1,2,3], [4,5,6]] n_samples 向量个数 2 n_features 向量中的神经元个数 3 y:[1, -1],1对应[1,2,3], -1对应[4,5,6] ''' def fit(self, x, y): # 初始化权重向量 # x:[[1,2,3], [4,5,6]] 得 x.shape[1] = 2,+1 w0 步调函数的阈值 self.w_ = np.zeros(1 + x.shape[1]) self.errors_ = []--------------------------------------------------
预测函数
# 预测函数 def predict(self, x): if self.net_input(x) >= 0.0: np.where(1) else: np.where(-1) pass
权重更新算法
学习率需要往往需要根据经验和场景自己设置。
# 训练次数 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): ''' Ps:公式 = 学习率 * (输入样本的正确分类 - 预测感知样本的分类) * xi ''' update = self.eta * (target - self.predict(xi)) ''' xi 是一个向量 update * xi 等价于 [∇w(1) = x[1] * update] w_[1:] 忽略掉第 0 个元素,从第 1 个元素开始 ''' self.w_[1:] += update * xi
权重和阈值更新示例