第十二课:大白话教你什么是感知机

感知机:神经网络的"幼稚园小朋友"

一:感知机是啥?——会画线的智能铅笔

1.1 最简单的神经网络

想象你教小朋友分类红蓝积木:

  • 感知机就像小朋友第一次尝试画线分开它们
  • 画歪了就擦掉重画,直到完全分开

本质:一个会自动调整的线性分类器
第十二课:大白话教你什么是感知机_第1张图片

1.2 感知机的三件套

  1. 输入层:接收特征(如积木的颜色值、形状值)
  2. 权重:每个特征的重要性(红色比形状更重要?)
  3. 激活函数:决定是否"开火"(要不要喊"这是蓝积木!")

类比
感知机就像个吃货评委

  • 输入:菜品咸度(X₁)、甜度(X₂)
  • 权重:更看重咸度(w₁=3),不太在乎甜度(w₂=1)
  • 激活函数:总分>5就点赞(输出1)

二:激活函数——感知机的"开关"

2.1 阶跃函数(原始版)

def step_function(x):
    return 1 if x >= 0 else 0
  • 作用:超过阈值就"开灯"
  • 缺点:像电灯开关,非0即1,不够细腻

2.2 Sigmoid(改进版)

import numpy as np
def sigmoid(x):
    return 1 / (1 + np.exp(-x))
  • 输出:0~1之间的概率值
  • 优点:能表示"可能是红色(0.7)"

比喻
阶跃函数像暴躁老板:“方案要么通过(1)要么重做(0)!”
Sigmoid像温和主管:“这方案可以打75分(0.75),再改改”

三:感知机算法——如何学会画线?

3.1 学习步骤(人类版)

  1. 随便画条线(初始化权重)
  2. 看哪个积木分错了(计算误差)
  3. 把线往错误积木那边挪(调整权重)
  4. 重复直到全部分对

3.2 数学公式

权重更新规则:

w = w + η * (y_true - y_pred) * x
  • η:学习率(每次调整的步子大小)
  • (y_true - y_pred):误差信号

举个栗子

  • 真实值=1,预测值=0 → 误差=1(需要加强权重)
  • 真实值=0,预测值=1 → 误差=-1(需要减弱权重)

四:代码实战——教感知机学OR逻辑

4.1 OR逻辑数据集

X₁ X₂ y
0 0 0
0 1 1
1 0 1
1 1 1

4.2 Python实现

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…权重调大点!
搞定!”

五:感知机的局限性——为什么它只是"小朋友"

5.1 致命缺陷:只能画直线

  • 解决不了非线性可分问题(如XOR逻辑)
  • 像试图用一根直线分开画在纸上的"笑脸"眼睛和嘴

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,学不会!

5.2 解决方案:多层感知机(MLP)

  • 多个感知机堆叠形成神经网络
  • 可以学习曲线边界(就像用多段线描边)

六:从感知机到深度学习

6.1 历史地位

  • 1957年由Frank Rosenblatt提出
  • 是神经网络和深度学习的基础
  • 相当于计算机界的"蒸汽机"——原始但开创性

6.2 现代变种

变种 改进点 典型应用
多层感知机 增加隐藏层 图像分类
卷积神经网络 局部感知 计算机视觉
循环神经网络 记忆功能 自然语言处理

进化比喻
单层感知机 → 三轮车
多层感知机 → 汽车
现代深度学习 → 宇宙飞船

七:总结——什么时候用感知机?

7.1 适用场景

✅ 教学演示(理解神经网络基础)
✅ 线性可分的简单分类(如垃圾邮件过滤)
✅ 资源受限环境(计算量极小)

7.2 不适用场景

❌ 非线性问题(用深度学习)
❌ 需要概率输出(用逻辑回归)
❌ 大数据集(容易欠拟合)

终极代码彩蛋:可视化感知机学习过程

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行!)

你可能感兴趣的:(大数据,数据挖掘,python,算法,数据分析)