微信登录

感知机 - 算法实现 - 感知机的代码实现

感知机 - 算法实现 - 感知机的代码实现

一、感知机简介

感知机(Perceptron)是由美国学者 Frank Rosenblatt 在 1957 年提出的一种二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别(取 +1 和 -1)。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。从几何意义上讲,感知机的目标是找到一个超平面,将不同类别的数据点分隔开来。

数学模型

给定一个训练数据集 $T = { (x_1, y_1), (x_2, y_2), \cdots, (x_N, y_N) }$,其中 $x_i \in \mathcal{X} = \mathbb{R}^n$,$y_i \in \mathcal{Y} = { +1, -1 }$,$i = 1, 2, \cdots, N$,感知机的模型可以表示为:
[ f(x) = \text{sign}(w \cdot x + b) ]
其中,$w \in \mathbb{R}^n$ 是权值向量,$b \in \mathbb{R}$ 是偏置,$\text{sign}$ 是符号函数,定义为:
[ \text{sign}(x) = \begin{cases} +1, & x \geq 0 \ -1, & x < 0 \end{cases} ]

二、感知机学习策略

感知机的学习目标是找到一个能够将训练数据集中的正类和负类完全分开的分离超平面,即确定模型参数 $w$ 和 $b$。为了达到这个目标,我们需要定义一个损失函数,并通过最小化损失函数来求解模型参数。

损失函数

感知机通常采用误分类点到分离超平面的总距离作为损失函数。对于一个误分类点 $(xi, y_i)$,它到超平面 $w \cdot x + b = 0$ 的距离为:
[ -\frac{y_i (w \cdot x_i + b)}{| w |} ]
其中,$| w |$ 是权值向量 $w$ 的 $L_2$ 范数。因此,所有误分类点到超平面的总距离为:
[ L(w, b) = -\sum
{x_i \in M} y_i (w \cdot x_i + b) ]
其中,$M$ 是误分类点的集合。

学习算法

感知机采用随机梯度下降(Stochastic Gradient Descent,SGD)算法来最小化损失函数。具体来说,对于一个误分类点 $(xi, y_i)$,损失函数 $L(w, b)$ 关于 $w$ 和 $b$ 的梯度分别为:
[ \nabla_w L(w, b) = -\sum
{xi \in M} y_i x_i ]
[ \nabla_b L(w, b) = -\sum
{x_i \in M} y_i ]
随机梯度下降算法的更新规则为:
[ w \leftarrow w + \eta y_i x_i ]
[ b \leftarrow b + \eta y_i ]
其中,$\eta$($0 < \eta \leq 1$)是学习率,它控制了每次参数更新的步长。

三、感知机的代码实现

Python 代码示例

  1. import numpy as np
  2. class Perceptron:
  3. def __init__(self, learning_rate=0.1, max_iter=1000):
  4. # 学习率
  5. self.learning_rate = learning_rate
  6. # 最大迭代次数
  7. self.max_iter = max_iter
  8. # 权值向量
  9. self.w = None
  10. # 偏置
  11. self.b = None
  12. def fit(self, X, y):
  13. n_samples, n_features = X.shape
  14. # 初始化权值向量和偏置
  15. self.w = np.zeros(n_features)
  16. self.b = 0
  17. for _ in range(self.max_iter):
  18. misclassified = False
  19. for i in range(n_samples):
  20. # 计算预测值
  21. prediction = np.dot(self.w, X[i]) + self.b
  22. if y[i] * prediction <= 0:
  23. # 如果是误分类点,更新权值向量和偏置
  24. self.w += self.learning_rate * y[i] * X[i]
  25. self.b += self.learning_rate * y[i]
  26. misclassified = True
  27. if not misclassified:
  28. # 如果没有误分类点,提前结束训练
  29. break
  30. def predict(self, X):
  31. # 计算预测值
  32. predictions = np.dot(X, self.w) + self.b
  33. # 使用符号函数将预测值转换为类别
  34. return np.sign(predictions)

代码解释

  1. __init__ 方法:初始化感知机的学习率和最大迭代次数,并将权值向量和偏置初始化为 None
  2. fit 方法:该方法用于训练感知机模型。首先,初始化权值向量和偏置为零。然后,在最大迭代次数内,遍历训练数据集中的每个样本。如果某个样本被误分类,则根据随机梯度下降算法更新权值向量和偏置。如果在一次迭代中没有误分类点,则提前结束训练。
  3. predict 方法:该方法用于对新样本进行预测。首先,计算每个样本的预测值,然后使用符号函数将预测值转换为类别(+1 或 -1)。

使用示例

  1. # 生成一些简单的训练数据
  2. X = np.array([[3, 3], [4, 3], [1, 1]])
  3. y = np.array([1, 1, -1])
  4. # 创建感知机对象
  5. perceptron = Perceptron(learning_rate=0.1, max_iter=100)
  6. # 训练感知机模型
  7. perceptron.fit(X, y)
  8. # 对新样本进行预测
  9. new_X = np.array([[2, 2]])
  10. predictions = perceptron.predict(new_X)
  11. print("预测结果:", predictions)

四、总结

感知机是一种简单而有效的二分类线性分类模型,其核心思想是通过最小化误分类点到分离超平面的总距离来找到一个能够将不同类别的数据点分隔开来的超平面。感知机的学习算法采用随机梯度下降算法,通过不断更新权值向量和偏置来逐步减少误分类点。

优点

  • 简单易懂:感知机的原理和实现都非常简单,易于理解和掌握。
  • 计算效率高:感知机的训练过程只需要进行简单的向量运算,计算效率高。

缺点

  • 只能处理线性可分的数据:如果训练数据不是线性可分的,感知机的学习算法将无法收敛。
  • 解不唯一:感知机的解依赖于初始值和学习率的选择,可能会得到不同的分离超平面。
项目 详情
模型类型 二分类线性分类模型
损失函数 误分类点到分离超平面的总距离
学习算法 随机梯度下降
优点 简单易懂、计算效率高
缺点 只能处理线性可分数据、解不唯一

通过上述代码实现和解释,我们可以看到感知机的基本原理和实现方法。在实际应用中,我们可以根据具体问题对感知机进行改进和扩展,以提高其性能和适用性。

感知机 - 算法实现 - 感知机的代码实现