本质:将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,
接下来是主程序部分,用于创建数据、训练感知机模型和进行预测。