你好,我是小黄 👋

这里是我的机器学习编程实验日志。我在这里记录仿真环境的搭建过程、模型的训练与调参, 以及程序运行产出的数据图表 —— 用代码,把“学习过程”一点点跑出来。

实验环境运行正常 🐍 Python 3.11 · PyTorch 2.x · scikit-learn 📅 持续更新中 📊 3 篇实验记录

实验一:线性回归 —— 用梯度下降拟合房价数据

第一个实验从最经典的线性回归入手。目标是理解 损失函数梯度下降 的收敛过程:我构造了一组带噪声的房价-面积样本, 用 NumPy 手写批量梯度下降,观察损失值随迭代次数的下降曲线。

实验步骤

  1. 构造合成数据集:y = 4.2x + 3.1 + 噪声,共 200 个样本;
  2. 初始化权重 w 与偏置 b 为 0,学习率取 0.01
  3. 迭代 200 轮,每轮记录均方误差(MSE);
  4. 可视化损失曲线与最终拟合直线。

核心代码

# 批量梯度下降:一元线性回归
import numpy as np

X = np.random.rand(200, 1) * 10
y = 4.2 * X.squeeze() + 3.1 + np.random.randn(200) * 2

w, b = 0.0, 0.0
lr = 0.01
losses = []
for epoch in range(200):
    pred = w * X.squeeze() + b
    loss = np.mean((pred - y) ** 2)   # MSE
    losses.append(loss)
    dw = np.mean(2 * (pred - y) * X.squeeze())
    db = np.mean(2 * (pred - y))
    w -= lr * dw
    b -= lr * db

运行结果

损失函数(MSE)随迭代次数下降曲线

4.19
拟合斜率 w
3.22
拟合截距 b
≈ 4.1
最终 MSE
结论:损失值在前几十轮快速下降、随后趋于平缓,说明梯度下降正常收敛; 拟合出的 w、b 与真实参数(4.2、3.1)非常接近,噪声并未被过拟合。

实验二:MNIST 手写数字识别 —— 三层全连接网络

第二个实验搭建了一个 三层全连接神经网络(784 → 128 → 64 → 10,ReLU 激活), 在 MNIST 手写数字数据集上训练 10 个 epoch。重点观察训练集与验证集上的 准确率损失 曲线,判断是否出现过拟合。

网络结构

  • 输入层:784 个神经元(28×28 像素展平);
  • 隐藏层:128、64 个神经元,ReLU 激活;
  • 输出层:10 个神经元,Softmax 输出类别概率;
  • 优化器:Adam(lr=0.001),损失函数:交叉熵 CrossEntropyLoss。

核心代码

import torch.nn as nn

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Sequential(
            nn.Linear(784, 128), nn.ReLU(),
            nn.Linear(128, 64),  nn.ReLU(),
            nn.Linear(64, 10),
        )

    def forward(self, x):
        return self.fc(x)

model = Net().to(device)
opt = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()

训练过程数据

准确率(Accuracy)随训练轮次变化

损失(Loss)随训练轮次变化

98.2%
测试集准确率
10
训练轮次
88k
可训练参数
⚠️ 观察:训练集准确率略高于验证集,二者差距很小(<1%), 说明模型处于轻微过拟合的临界点。下一步可以加入 Dropout 或数据增强来缓解。

实验三:K-Means 聚类 —— 鸢尾花数据集的自动分组

第三个实验转向 无监督学习:用 K-Means 算法对经典的鸢尾花(Iris)数据集 做聚类。数据有 4 个特征(花萼/花瓣的长宽),我先用 PCA 降到 2 维用于可视化, 再取 k=3 聚类,看算法能否把三种鸢尾花自动分开。

实验步骤

  1. 加载 Iris 数据集(150 个样本,3 个类别,每类 50 个);
  2. 用 PCA 将 4 维特征降到 2 维,便于绘图;
  3. 设定 n_clusters=3 运行 K-Means;
  4. 对比聚类结果与真实标签的轮廓系数(Silhouette Score)。

核心代码

from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score

pca = PCA(n_components=2)
X_2d = pca.fit_transform(X)

km = KMeans(n_clusters=3, n_init=10, random_state=42)
labels = km.fit_predict(X_2d)
score = silhouette_score(X_2d, labels)
print(f"轮廓系数: {score:.3f}")

聚类可视化

PCA 降维后的样本分布与 K-Means 聚类结果

0.58
轮廓系数
3
簇数量 k
96%
PCA 方差解释率
结论:轮廓系数 0.58 表明簇内较紧凑、簇间分离尚可。三种鸢尾花中 有两种被干净地分开,另一类有少量重叠 —— 这与该数据集本身的特点一致。