本篇教程将详细介绍如何使用Python编程语言来实现经典的机器学习算法——感知机(Perceptron Learning Algorithm, PLA)。通过逐步指导读者构建模型、训练及测试过程,帮助理解这一基本的线性分类器的工作原理。
### Python 实现感知机(PLA)算法
#### 一、感知机算法简介
感知机是一种二类线性分类模型,是神经网络的基础之一。它主要用于解决线性可分问题,即通过寻找一个超平面来将不同类别的数据分开。在机器学习领域,感知机是一个重要的概念,它为更复杂的模型如支持向量机(SVM)和深度学习奠定了基础。
#### 二、感知机算法原理
感知机的核心思想是通过不断调整权重向量 $\mathbf{w}$ 和偏置项 $b$,找到一个能够正确分类所有训练样本的决策边界。具体而言,感知机通过以下步骤进行学习:
1. **初始化**:初始化权重向量 $\mathbf{w}$ 和偏置项 $b$。
2. **预测**:对于每一个训练样本 $(\mathbf{x}_i, y_i)$,计算预测值 $\hat{y}_i = \text{sign}(\mathbf{w}^T \mathbf{x}_i + b)$,其中 $\text{sign}(z)$ 表示符号函数,当 $z > 0$ 时返回 $1$,当 $z \leq 0$ 时返回 $-1$。
3. **更新**:如果预测值与真实值不一致,则根据误分类样本更新权重向量和偏置项:
$$\mathbf{w} \leftarrow \mathbf{w} + \eta y_i \mathbf{x}_i$$
$$b \leftarrow b + \eta y_i$$
其中 $\eta$ 是学习率,通常设为 $1$。
4. **重复**:重复以上过程直到没有误分类样本为止。
#### 三、Python 实现
下面是一段使用 Python 编写的简单感知机算法代码实现。该代码包括了数据生成、感知机类定义以及绘图功能。
```python
import numpy as np
import matplotlib.pyplot as plt
# 创建数据集
def create_data():
samples = np.array([[3, -3], [4, -3], [1, 1], [1, 2]])
labels = [-1, -1, 1, 1]
return samples, labels
class Perceptron:
def __init__(self, x, y):
self.x = x
self.y = y
self.w = np.zeros((x.shape[1], 1)) # 初始化权重,w1,w2均为0
self.b = 0
self.a = 1 # 学习率
self.num_samples = self.x.shape[0]
self.num_features = self.x.shape[1]
def sign(self, w, b, x):
y = np.dot(x, w) + b
return int(y)
def update(self, label_i, data_i):
tmp = label_i * self.a * data_i
tmp = tmp.reshape(self.w.shape)
# 更新w和b
self.w += tmp
self.b += label_i * self.a
def train(self):
is_find = False
while not is_find:
count = 0
for i in range(self.num_samples):
tmp_y = self.sign(self.w, self.b, self.x[i])
if tmp_y * self.y[i] <= 0: # 如果是一个误分类实例点
print(误分类点为:, self.x[i], 此时的w和b为:, self.w, self.b)
count += 1
self.update(self.y[i], self.x[i])
if count == 0:
is_find = True
class Picture:
def __init__(self, data, w, b):
plt.figure(1)
plt.title(Perceptron Learning Algorithm, size=14)
plt.xlabel(x0-axis, size=14)
plt.ylabel(x1-axis, size=14)
x_data = np.linspace(0, 5, 100)
y_data = self.expression(x_data)
plt.plot(x_data, y_data, color=r, label=sample data)
for i in range(len(data)):
if labels[i] == -1:
plt.scatter(data[i][0], data[i][1], s=50)
else:
plt.scatter(data[i][0], data[i][1], s=50, marker=x)
def expression(self, x):
y = (-self.b - self.w[0] * x) / self.w[1]
return y
if __name__ == __main__:
samples, labels = create_data()
my_perceptron = Perceptron(samples, labels