机器学习核心算法详解

机器学习算法浩如烟海,但绝大多数复杂模型都是建立在几个核心算法的基础之上的。我们可以将它们大致分为监督学习(有标签)和无监督学习(无标签)两大类。

以下是五种最经典、最核心的机器学习算法的详细对比、场景、公式及代码实现:


1. 线性回归 (Linear Regression)

核心概念与区别:用于回归任务(预测连续值)。它假设特征与目标变量之间存在线性关系,通过拟合一条直线(或高维超平面)来最小化预测值与真实值之间的误差。它是最基础的预测模型,模型简单且可解释性极强。

应用场景

  • 房价预测(基于面积、地段等连续变量)。
  • 销售额预测。
  • 经济学中的趋势分析。

核心公式
假设函数 (Hypothesis):
$$h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + … + \theta_nx_n = \theta^Tx$$
代价函数 (均方误差 MSE, Cost Function):
$$J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2$$

实例代码 (Python / scikit-learn)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np
from sklearn.linear_model import LinearRegression

# 1. 准备数据 (X为特征, y为目标值)
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([1.2, 1.9, 3.2, 3.8, 5.1])

# 2. 初始化模型并训练
model = LinearRegression()
model.fit(X, y)

# 3. 预测新数据
X_new = np.array([[6]])
prediction = model.predict(X_new)
print(f"预测结果: {prediction[0]:.2f}")

2. 逻辑回归 (Logistic Regression)

核心概念与区别:名字里虽然有“回归”,但它主要用于二分类任务。它在线性回归的基础上,通过一个非线性的 Sigmoid 函数,将连续的预测值映射到 $0$ 到 $1$ 之间的概率区间。它与线性回归的区别在于输出的非线性转换及损失函数的不同。

应用场景

  • 垃圾邮件检测(是/否)。
  • 疾病风险诊断(患病/不患病)。
  • 金融领域的信用卡欺诈预测。

核心公式
Sigmoid 映射函数:
$$g(z) = \frac{1}{1 + e^{-z}}$$
假设函数:
$$h_\theta(x) = g(\theta^Tx) = \frac{1}{1 + e^{-\theta^Tx}}$$
代价函数 (交叉熵损失 Cross-Entropy Loss):
$$J(\theta) = -\frac{1}{m} \sum_{i=1}^{m} \left[ y^{(i)} \log(h_\theta(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right]$$

实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification

# 1. 生成二分类假数据
X, y = make_classification(n_samples=100, n_features=2, n_classes=2, random_state=42)

# 2. 初始化模型并训练
model = LogisticRegression()
model.fit(X, y)

# 3. 预测分类及概率
X_test = [[0.5, -0.5]]
print(f"预测类别: {model.predict(X_test)[0]}")
print(f"预测概率: {model.predict_proba(X_test)[0]}")

3. 支持向量机 (Support Vector Machine, SVM)

核心概念与区别:主要用于分类(也可用于回归)。其核心思想是在特征空间中寻找一个最大间隔超平面(Margin),将不同类别的数据尽可能宽地分开。对于非线性数据,SVM 利用“核技巧 (Kernel Trick)”将数据映射到高维空间使其线性可分。相比逻辑回归,SVM 在高维空间和小样本数据集上表现更优,且只关注边界上的数据点(支持向量)。

应用场景

  • 图像分类与人脸识别。
  • 文本分类(如新闻分类)。
  • 生物信息学(蛋白质分类)。

核心公式
线性可分情况下的优化目标(硬间隔):
$$\min_{w,b} \frac{1}{2} ||w||^2$$
约束条件:
$$y_i(w^T x_i + b) \ge 1, \quad i = 1, …, m$$

实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.svm import SVC
from sklearn.datasets import make_blobs

# 1. 生成数据
X, y = make_blobs(n_samples=50, centers=2, random_state=6)

# 2. 初始化SVM模型 (使用线性核)
model = SVC(kernel='linear', C=1.0)
model.fit(X, y)

# 3. 获取支持向量并预测
print(f"支持向量数量: {len(model.support_vectors_)}")
print(f"预测新样本: {model.predict([[2, -2]])[0]}")

4. 决策树 (Decision Tree)

核心概念与区别:可用于分类和回归。它模仿人类做决策的过程,通过对特征设定一系列“如果-那么 (If-Then)”的条件,将数据像树枝一样不断分裂。它的主要区别在于其高度的可解释性,并且不需要对数据进行归一化处理。它是随机森林 (Random Forest) 和梯度提升树 (GBDT) 等高级集成算法的基石。

应用场景

  • 客户流失预测与分群。
  • 医疗诊断系统的辅助决策。
  • 银行信贷风险评估。

核心公式
决策树通过不纯度指标(如信息熵或基尼系数)来选择最佳划分特征。
信息熵 (Entropy):
$$H(D) = -\sum_{k=1}^{K} p_k \log_2 p_k$$
基尼系数 (Gini Impurity, CART树常用):
$$Gini(p) = \sum_{k=1}^{K} p_k (1 - p_k) = 1 - \sum_{k=1}^{K} p_k^2$$

实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

# 1. 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data, iris.target

# 2. 初始化决策树模型并训练
model = DecisionTreeClassifier(max_depth=3, criterion='gini')
model.fit(X, y)

# 3. 预测
print(f"预测分类: {iris.target_names[model.predict([[5.1, 3.5, 1.4, 0.2]])[0]]}")

5. K-均值聚类 (K-Means)

核心概念与区别:属于无监督学习,即数据没有标签。K-Means 的目标是将数据分为 $K$ 个簇(Cluster),使得簇内的数据点尽可能相似,而簇间的数据点尽可能不同。它通过不断迭代更新“簇中心”来实现。这是与前面四种监督学习算法最本质的区别。

应用场景

  • 市场营销中的目标客户群体细分。
  • 图像压缩(减少图像颜色数量)。
  • 异常检测(远离所有聚类中心的点)。

核心公式
目标是最小化簇内平方误差和 (WCSS, Within-Cluster Sum of Squares):
$$J = \sum_{j=1}^{K} \sum_{x_i \in C_j} ||x_i - \mu_j||^2$$
其中 $\mu_j$ 是第 $j$ 个簇 $C_j$ 的质心。

实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import numpy as np

# 1. 生成无标签数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 2. 初始化K-Means模型 (设定簇数为4)
kmeans = KMeans(n_clusters=4, n_init='auto')
kmeans.fit(X)

# 3. 输出聚类中心和预测标签
print(f"聚类中心坐标:\n{kmeans.cluster_centers_}")
new_point = np.array([[0, 0]])
print(f"新数据点归属的簇标签: {kmeans.predict(new_point)[0]}")

核心算法横向对比总结

算法名称 学习类型 核心任务 优势 劣势
线性回归 监督学习 回归 (连续值) 简单直观,计算极快,可解释性强。 只能处理线性关系,容易欠拟合。
逻辑回归 监督学习 分类 (主要是二分类) 输出带有概率意义,训练速度快。 难以处理复杂的非线性边界。
支持向量机 监督学习 分类 / 回归 高维空间表现好,能通过核函数处理非线性。 大规模数据集上训练慢,参数调优难。
决策树 监督学习 分类 / 回归 极其直观,符合人类思维,无需数据缩放。 极易过拟合(需要剪枝或使用集成方法)。
K-Means 无监督学习 聚类 (分群) 原理简单,聚类速度快。 需人为指定K值,对初始点和异常值敏感。