kunqixuexishiyan6

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.decomposition import PCA
from sklearn.datasets import fetch_openml

# 加载MNIST数据集
mnist = fetch_openml("mnist_784", version=1, cache=True)
# 将DataFrame转换为numpy array格式
x = mnist["data"].to_numpy()
y = mnist["target"].to_numpy()

# 定义可视化显示图片的函数
def plot_digits(data):
"""
该函数用于显示数字图片,每次会显示4行10列的图像。
"""
fig, axes = plt.subplots(4, 10, figsize=(10, 4), # 创建一个包含4行10列子图的图像
subplot_kw={'xticks':[], 'yticks':[]}, # 取消每个子图的坐标轴
gridspec_kw=dict(hspace=0.1, wspace=0.1)) # 设置子图间的间距
for i, ax in enumerate(axes.flat): # 遍历每个子图
ax.imshow(data[i].reshape(28, 28), # 将一个1D数组(784长度)重塑为28x28的2D数组
cmap='binary', interpolation='nearest', # 设置灰度颜色和最近推值法
clim=(0, 16)) # 设置颜色图的界限
plt.show() # 显示图像

# 显示原始图片
plt.figure() # 创建新的图像
plot_digits(x) # 显示MNIST数据集的前40张图片

# 画出累积方差贡献率曲线
pca = PCA().fit(x) # 使用PCA对数据进行拟合
plt.figure(figsize=[20, 5]) # 创建宽20、高5的图像
plt.plot(np.cumsum(pca.explained_variance_ratio_)) # 累积PCA解释的方差比例
plt.xlabel("number of components after dimension reduction") # 设置x轴标签
plt.ylabel("cumulative explained variance ratio") # 设置y轴标签
plt.show() # 显示图像

# 在前100个主成分维度上,找出最优点
score = [] # 初始化列表用于保存交叉验证得分
for i in range(1, 101, 10): # 遍历1到100,每10步一个值
x_dr = PCA(i).fit_transform(x) # 使用i个主成分进行PCA降维
# 交叉验证,用随机森林模型的准确率来判断降维的好坏
once = cross_val_score(RFC(n_estimators=10, random_state=0), x_dr, y, cv=5).mean() # 计算5折交叉验证的平均得分
score.append(once) # 将得分添加到列表中

plt.figure(figsize=[20, 5]) # 创建宽20、高5的图像
plt.plot(range(1, 101, 10), score) # 绘制交叉验证得分的折线图
plt.xlabel("number of components") # 设置x轴标签
plt.ylabel("Validation accuracy") # 设置y轴标签
plt.show() # 显示图像

# 进一步缩小维度的范围,细化寻找最高点
score = [] # 再次初始化列表用于保存交叉验证得分
for i in range(10, 25): # 遍历10到25,每1步一个值
x_dr = PCA(i).fit_transform(x) # 使用i个主成分进行PCA降维
once = cross_val_score(RFC(n_estimators=10, random_state=0), x_dr, y, cv=5).mean() # 计算5折交叉验证的平均得分
score.append(once) # 将得分添加到列表中

plt.figure(figsize=[20, 5]) # 创建宽20、高5的图像
plt.plot(range(10, 25), score) # 绘制交叉验证得分的折线图
plt.xlabel("number of components") # 设置x轴标签
plt.ylabel("Validation accuracy") # 设置y轴标签
plt.show() # 显示图像

# 根据细化学习曲线,找出最佳维度为21,重构手写体图片
optimal_components = 21 # 设定最优主成分数为21
pca = PCA(optimal_components).fit(x) # 使用21个主成分进行PCA拟合
x_dr = pca.transform(x) # 对数据进行降维
re_img = pca.inverse_transform(x_dr) # 将降维的数据反转回原始空间,这样可以看到重构后的图片

# 显示降维后重构的图片
plt.figure() # 创建新的图像
plot_digits(re_img) # 显示重构后的前40张图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值