想象你教小朋友分类红蓝积木:
类比:
感知机就像个吃货评委:
- 输入:菜品咸度(X₁)、甜度(X₂)
- 权重:更看重咸度(w₁=3),不太在乎甜度(w₂=1)
- 激活函数:总分>5就点赞(输出1)
def step_function(x):
return 1 if x >= 0 else 0
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
比喻:
阶跃函数像暴躁老板:“方案要么通过(1)要么重做(0)!”
Sigmoid像温和主管:“这方案可以打75分(0.75),再改改”
权重更新规则:
w = w + η * (y_true - y_pred) * x
η
:学习率(每次调整的步子大小)(y_true - y_pred)
:误差信号举个栗子:
X₁ | X₂ | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
import numpy as np
class Perceptron:
def __init__(self, lr=0.1, n_iters=10):
self.lr = lr # 学习率
self.n_iters = n_iters # 训练轮数
self.weights = None # 权重
self.bias = None # 偏置
def fit(self, X, y):
n_samples, n_features = X.shape
self.weights = np.zeros(n_features)
self.bias = 0
for _ in range(self.n_iters):
for idx, x_i in enumerate(X):
# 计算预测值
linear_output = np.dot(x_i, self.weights) + self.bias
y_pred = step_function(linear_output)
# 更新权重
update = self.lr * (y[idx] - y_pred)
self.weights += update * x_i
self.bias += update
def predict(self, X):
linear_output = np.dot(X, self.weights) + self.bias
return np.array([step_function(x) for x in linear_output])
# 训练OR逻辑
X = np.array([[0,0], [0,1], [1,0], [1,1]])
y = np.array([0, 1, 1, 1])
p = Perceptron(lr=0.1, n_iters=10)
p.fit(X, y)
print("测试预测:")
print(p.predict(np.array([[0,0], [1,0], [0,1], [1,1]])))
输出:
[0 1 1 1] # 成功学会OR逻辑!
感知机内心戏:
“啊,输入(0,0)该输出0…权重调小点!
输入(1,0)该输出1…权重调大点!
搞定!”
XOR问题示例:
X₁ | X₂ | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
xor_X = np.array([[0,0], [0,1], [1,0], [1,1]])
xor_y = np.array([0, 1, 1, 0])
p.fit(xor_X, xor_y)
print(p.predict(xor_X)) # 输出可能全0或全1,学不会!
变种 | 改进点 | 典型应用 |
---|---|---|
多层感知机 | 增加隐藏层 | 图像分类 |
卷积神经网络 | 局部感知 | 计算机视觉 |
循环神经网络 | 记忆功能 | 自然语言处理 |
进化比喻:
单层感知机 → 三轮车
多层感知机 → 汽车
现代深度学习 → 宇宙飞船
✅ 教学演示(理解神经网络基础)
✅ 线性可分的简单分类(如垃圾邮件过滤)
✅ 资源受限环境(计算量极小)
❌ 非线性问题(用深度学习)
❌ 需要概率输出(用逻辑回归)
❌ 大数据集(容易欠拟合)
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
# 初始化画布
fig, ax = plt.subplots()
ax.set_xlim(-0.5, 1.5)
ax.set_ylim(-0.5, 1.5)
line, = ax.plot([], [], 'r-')
# OR逻辑数据点
ax.scatter([0,1,1], [0,0,1], c='blue', label='1')
ax.scatter([0], [1], c='red', label='0')
# 更新函数
def update(i):
p.fit(X, y) # 每次迭代训练一轮
x_vals = np.array([-0.5, 1.5])
y_vals = -(p.weights[0]*x_vals + p.bias)/p.weights[1]
line.set_data(x_vals, y_vals)
ax.set_title(f'Epoch {i+1}')
return line,
# 创建动画
ani = FuncAnimation(fig, update, frames=10, blit=True)
plt.legend()
plt.show()
你会看到:
一条红线逐渐移动,最终完美分开蓝色和红色点!
最后总结:
感知机就像神经网络家族的小宝宝:
- 虽然能力有限(只会画直线)
- 但是潜力无限(是所有深度学习的基础)
- 而且超级可爱(代码实现只要20行!)