本質:將n維空間中的一些點線性投影到一維,在一維軸上找一個閾值對這些點進行二分類。
程序:
import numpy as npclass Perceptron:def __init__(self, learning_rate=0.01, n_iterations=1000):self.learning_rate = learning_rateself.n_iterations = n_iterationsdef fit(self, X, y):self.weights = np.zeros(1 + X.shape[1])self.errors = []for _ in range(self.n_iterations):error = 0for xi, target in zip(X, y):update = self.learning_rate * (target - self.predict(xi))self.weights[1:] += update * xiself.weights[0] += updateerror += int(update != 0.0)self.errors.append(error)return selfdef net_input(self, X):return np.dot(X, self.weights[1:]) + self.weights[0]def predict(self, X):return np.where(self.net_input(X) >= 0.0, 1, -1)# 創建一些簡單的訓練數據
X_train = np.array([[2, 3], [4, 5], [1, 2], [5, 3]])
y_train = np.array([1, 1, -1, -1])# 創建感知機對象并進行訓練
perceptron = Perceptron()
perceptron.fit(X_train, y_train)# 進行預測
X_test = np.array([[3, 4], [1, 1]])
predictions = perceptron.predict(X_test)
print("Predictions:", predictions)print(X_train.shape[1])
print(perceptron.weights)
逐句解釋:
1,
import numpy as np
這一行導入了 NumPy 庫,NumPy 是 Python 中用于科學計算的一個核心庫,它提供了強大的數組和矩陣操作功能。
2,
class Perceptron:
這一行定義了一個名為 Perceptron 的類,用于實現感知機算法。
3,
def __init__(self, learning_rate=0.01, n_iterations=1000):
這是 Perceptron 類的構造函數,用于初始化感知機的學習率和迭代次數,默認學習率為 0.01,迭代次數為 1000。
4,
self.learning_rate = learning_rateself.n_iterations = n_iterations
這兩行將傳入的學習率和迭代次數保存在類的實例變量中,以便在類的其他方法中使用。
5,
def fit(self, X, y):
這是 Perceptron 類的方法,用于訓練感知機模型。它接受輸入數據 X 和標簽 y 作為參數。
6,
self.weights = np.zeros(1 + X.shape[1])
這一行創建了一個初始權重向量,長度為輸入特征數加 1,所有元素初始化為零。權重向量的第一個元素對應于偏置項。
7,
self.errors = []
這一行創建了一個空列表,用于保存每次迭代中誤分類樣本的數量,以便后續可視化訓練過程中的錯誤。
8,
for _ in range(self.n_iterations):
這是一個迭代循環,用于執行感知機的訓練過程,循環次數由 n_iterations 指定。
9,
error = 0
在每次迭代開始時,將誤分類樣本的計數器初始化為零。
10,
for xi, target in zip(X, y):
這是一個嵌套循環,遍歷輸入數據 X 和對應的標簽 y,其中 xi 是當前樣本的特征向量,target 是當前樣本的真實標簽。
11,
update = self.learning_rate * (target - self.predict(xi))
計算當前樣本的預測結果與真實標簽之間的誤差,并乘以學習率,得到權重更新值。
12,
self.weights[1:] += update * xiself.weights[0] += update
根據誤差更新權重向量。更新規則是:對于權重向量中除了偏置項以外的元素,按照輸入特征與誤差的乘積更新;偏置項單獨更新。
13,
error += int(update != 0.0)
更新誤分類樣本的計數器。
14,
self.errors.append(error)
將當前迭代的誤分類樣本數量添加到錯誤列表中。
15,
return self
訓練結束后,返回訓練好的感知機模型。
16,
def net_input(self, X):
這是一個輔助方法,用于計算感知機的輸入,即輸入數據與權重向量的線性組合。
17,
return np.dot(X, self.weights[1:]) + self.weights[0]
計算輸入數據 X 與權重向量除偏置項外的部分的點積,再加上偏置項,得到感知機的輸入。
18,
def predict(self, X):
這是 Perceptron 類的方法,用于對輸入數據進行預測。
19,
return np.where(self.net_input(X) >= 0.0, 1, -1)
根據感知機的輸入,通過閾值函數(大于等于0即為正類,否則為負類)對輸入數據進行分類預測,返回預測結果。
20,
接下來是主程序部分,用于創建數據、訓練感知機模型和進行預測。