【无标题】神经网络算法初探
参考文献:
https://mp.weixin.qq.com/s/FCcenV1dyqMim1RKm2ccWQ?scene=1&click_id=104
https://www.deepseek.com/
代码:
import numpy as np //导入 NumPy 库并将其命名为 np
import matplotlib.pyplot as plt //导入 Matplotlib 库的 pyplot 模块并将其命名为 plt
import seaborn as sns//导入 Seaborn 库并将其命名为 sns
from sklearn.neural_network import MLPClassifier//从 scikit-learn 库的 neural_network 模块中导入 MLPClassifier 类
from sklearn.model_selection import train_test_split//从 scikit-learn 库的 model_selection 模块中导入 train_test_split 函数
from sklearn.datasets import load_iris//从 scikit-learn 库的 datasets 模块中导入 load_iris 函数
from sklearn.preprocessing import StandardScaler//从 scikit-learn 库的 preprocessing 模块中导入 StandardScaler 类
from matplotlib.colors import ListedColormap//从 Matplotlib 库的 colors 模块中导入 ListedColormap 类
# 1. 加载和预处理数据
# 加载鸢尾花数据集
iris = load_iris() //加载鸢尾花数据集并将其存储在名为 iris 的变量中
# 为了便于可视化,我们只选取前两个特征:花萼长度和花萼宽度
X = iris.data[:, :2]
y = iris.target
# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 数据标准化(非常重要,有助于神经网络收敛)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 2. 训练神经网络模型
# MLPClassifier 是一个多层感知机分类器
# hidden_layer_sizes=(10, 5): 两个隐藏层,分别有10个和5个神经元
# max_iter=1000: 最大迭代次数,防止训练时间过长
# alpha=0.01: L2 正则化参数,防止过拟合
# random_state=1: 随机种子,确保结果可复现
# early_stopping=True: 提前停止训练,如果验证分数没有提高,则停止
mlp = MLPClassifier(hidden_layer_sizes=(10, 5), max_iter=1000, alpha=0.01,
solver='adam', verbose=False, random_state=1,
early_stopping=True)
# 训练模型
mlp.fit(X_train_scaled, y_train)
# 3. 评估模型
train_score = mlp.score(X_train_scaled, y_train)
test_score = mlp.score(X_test_scaled, y_test)
print(f"训练集准确率: {train_score:.2f}")
print(f"测试集准确率: {test_score:.2f}")
# 4. 绘制训练过程中的损失函数曲线
plt.figure(figsize=(10, 6))
plt.plot(mlp.loss_curve_)
plt.title("训练损失函数曲线", fontsize=16)
plt.xlabel("迭代次数", fontsize=12)
plt.ylabel("损失值", fontsize=12)
plt.grid(True)
plt.show()
# 5. 绘制决策边界图
def plot_decision_boundary(X, y, model, scaler):
h = .02 # 网格步长
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
# 使用训练好的模型对网格点进行预测
Z = model.predict(scaler.transform(np.c_[xx.ravel(), yy.ravel()]))
Z = Z.reshape(xx.shape)
# 绘制等高线和散点图
plt.figure(figsize=(10, 6))
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)
# 绘制训练数据点
sns.scatterplot(x=X[:, 0], y=X[:, 1], hue=y, palette=cmap_bold, s=80, alpha=0.8,
edgecolor='k', legend=False)
plt.title("神经网络的决策边界图", fontsize=16)
plt.xlabel("花萼长度 (cm)", fontsize=12)
plt.ylabel("花萼宽度 (cm)", fontsize=12)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.show()
# 调用函数绘制决策边界图
plot_decision_boundary(X, y, mlp, scaler)