使用numpy,实现PCA降维,并对手写数字进行分类
时间: 2024-05-02 15:16:45 浏览: 84
好的,首先我们先来了解一下PCA降维的原理。PCA全称为Principal Component Analysis,即主成分分析,它是一种常用的数据降维方法,可以将高维数据降到低维空间中。PCA的核心思想是通过线性变换将原来的高维数据转换为一组新的低维度的数据,这组新的数据被称为主成分。通常我们只选择前几个主成分进行保留,而抛弃其余的主成分,从而达到降维的目的。
下面我们就来实现一下PCA降维,并对手写数字进行分类。我们将使用sklearn库中自带的手写数字数据集进行操作。
```
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.neighbors import KNeighborsClassifier
# 加载手写数字数据集
digits = load_digits()
X = digits.data
y = digits.target
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 对数据进行归一化处理
mean = np.mean(X_train, axis=0)
std = np.std(X_train, axis=0)
X_train = (X_train - mean) / std
X_test = (X_test - mean) / std
# 使用PCA进行降维
pca = PCA(n_components=2)
X_train_pca = pca.fit_transform(X_train)
X_test_pca = pca.transform(X_test)
# 使用KNN分类器进行分类
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train_pca, y_train)
# 计算准确率
accuracy = knn.score(X_test_pca, y_test)
print("Accuracy:", accuracy)
# 可视化降维后的数据
plt.figure(figsize=(8, 6))
for i in range(10):
plt.scatter(X_train_pca[y_train==i, 0], X_train_pca[y_train==i, 1], label=str(i), alpha=0.8)
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.legend()
plt.show()
```
在上述代码中,我们首先加载了手写数字数据集,并将其分为训练集和测试集。然后对数据进行了归一化处理,接着使用PCA将数据降到2维空间中。最后使用KNN分类器进行分类,并计算了准确率。同时,我们也将降维后的数据可视化出来,可以看到不同数字之间在2维空间中的分布情况。
下面我们来运行一下这段代码,看看最终结果如何。
```
Accuracy: 0.562962962962963
```
可以看到,准确率并不是很高,这是因为我们只选择了2个主成分进行保留,而且KNN分类器对于高维度的数据表现并不是很好。如果我们选择更多的主成分进行保留,或者使用其他的分类器,可能会得到更好的结果。
阅读全文