机器学习基础:从感知机到自适应线性神经元的算法实现
引言
在机器学习领域,理解基础算法的工作原理对于掌握更复杂的模型至关重要。本章将深入探讨两种经典的机器学习算法:感知机和自适应线性神经元(Adaline)。这些算法不仅是神经网络的基础,也为理解现代深度学习模型提供了重要视角。
人工神经元:机器学习的早期历史
人工神经元的正式定义
人工神经元是模拟生物神经元行为的数学模型,其核心思想可以追溯到1943年McCulloch和Pitts的工作。一个基本的人工神经元包含以下组成部分:
- 输入信号:x₁, x₂, ..., xₙ
- 权重参数:w₁, w₂, ..., wₙ
- 激活函数:φ(z)
- 输出:y
数学表达式为: z = w₁x₁ + w₂x₂ + ... + wₙxₙ + b y = φ(z)
其中b为偏置项,用于调整模型的灵活性。
感知机学习规则
感知机由Frank Rosenblatt在1957年提出,是最早的机器学习算法之一。其学习规则可以概括为:
- 初始化权重为小随机数或零
- 对每个训练样本xⁱ: a. 计算输出值ŷ b. 更新权重:Δwⱼ = η(yⁱ - ŷⁱ)xⱼⁱ
其中η是学习率,控制每次更新的步长。感知机使用单位阶跃函数作为激活函数,使其成为二元分类器。
Python实现感知机学习算法
面向对象的感知机API设计
良好的API设计能提高代码的复用性和可维护性。我们建议采用以下类结构:
class Perceptron:
def __init__(self, learning_rate=0.01, n_iter=50):
self.learning_rate = learning_rate
self.n_iter = n_iter
def fit(self, X, y):
# 初始化权重
self.weights = np.zeros(1 + X.shape[1])
self.errors_ = []
# 训练过程
for _ in range(self.n_iter):
errors = 0
for xi, target in zip(X, y):
update = self.learning_rate * (target - self.predict(xi))
self.weights[1:] += update * xi
self.weights[0] += update
errors += int(update != 0.0)
self.errors_.append(errors)
return self
def 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)
在Iris数据集上训练感知机模型
Iris数据集是机器学习中的经典数据集,包含三种鸢尾花的测量数据。我们可以使用感知机来区分Setosa和Versicolor两种花:
- 加载并预处理数据
- 选择两个特征(如花瓣长度和宽度)进行可视化
- 标准化特征(非必须但推荐)
- 训练感知机模型
- 绘制决策边界和错误收敛曲线
自适应线性神经元与学习收敛性
使用梯度下降最小化代价函数
Adaline(Adaptive Linear Neuron)是感知机的改进版本,主要区别在于:
- 使用线性激活函数而非阶跃函数
- 基于梯度下降最小化连续可微的代价函数
- 更新权重前计算所有样本的梯度
代价函数通常使用平方误差和(SSE): J(w) = 1/2 Σ(yⁱ - φ(zⁱ))²
梯度下降的权重更新规则: Δw = -η∇J(w) = ηΣ(yⁱ - φ(zⁱ))xⁱ
Python实现Adaline
class AdalineGD:
def __init__(self, learning_rate=0.01, n_iter=50):
self.learning_rate = learning_rate
self.n_iter = n_iter
def fit(self, X, y):
self.weights = np.zeros(1 + X.shape[1])
self.cost_ = []
for _ in range(self.n_iter):
output = self.net_input(X)
errors = y - output
self.weights[1:] += self.learning_rate * X.T.dot(errors)
self.weights[0] += self.learning_rate * errors.sum()
cost = (errors**2).sum() / 2.0
self.cost_.append(cost)
return self
# 其他方法与Perceptron类相同
通过特征缩放改进梯度下降
梯度下降对特征尺度敏感,建议进行标准化处理: x'ⱼ = (xⱼ - μⱼ) / σⱼ
其中μⱼ是特征j的均值,σⱼ是标准差。标准化后特征将具有零均值和单位方差。
大规模机器学习与随机梯度下降
当数据集很大时,批量梯度下降计算成本高昂。随机梯度下降(SGD)每次只用一个样本更新权重:
- 随机打乱训练数据
- 对每个样本逐步更新权重
- 学习率通常随时间递减
SGD的优点是:
- 更快收敛
- 能跳出局部极小值
- 适合在线学习
总结
本章介绍了机器学习的基础算法:感知机和自适应线性神经元。关键点包括:
- 感知机使用阶跃函数,适合线性可分问题
- Adaline使用线性激活函数和梯度下降,能处理更复杂情况
- 特征缩放对梯度下降算法至关重要
- 随机梯度下降适合大规模数据集
理解这些基础算法为学习更复杂的神经网络和深度学习模型奠定了坚实基础。在实际应用中,建议从简单模型开始,逐步增加复杂度。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考