最基本的感知器算法
import numpy as npclass Perceptron(object):"""eta: 學習率n_iter: 權重向量的訓練次數w_: 神經分叉權重向量errors_: 用于記錄神經元判斷出錯次數"""def __init__(self, eta = 0.01, n_iter = 10):self.eta = etaself.n_iter = n_iterpassdef fit(self, X, y):"""輸入訓練數據,培訓神經元,X表示輸入樣本, y對應該樣本的正確分類X: shape[n_samples, n_features]n_samples:表示有多少個訓練樣本數量n_features: 表示有多少個屬性例如:X: [[1,2,3], [4,5,6]] => n_samples=2;n_features=3y: [1, -1]表示第一個向量的分類是1, 第二個向量的分類是-1""""""首先初始化權重為0加一是因為激活函數w0的閾值"""self.w_ = np.zero(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 是一個常量update*xi 等價于 [Δw(1) = X[1]*update, Δw(2) = X[2]*update, Δw(3) = X[3]*update]"""# w_[1:]表示w忽略第0個元素,從第一個元素開始往后self.w_[1:] += update * xiself.w_[0] += updateerrors += int(update != 0.0)self.errors_.append(errors)passpassdef net_input(self, X):"""z = W0*1 + W1*X1 + W2*X2+ ...+ Wn*Xn"""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)
?
總結
- 上一篇: 补的牙会磨没吗
- 下一篇: 矫正牙齿会把嘴撑大吗