不采用调库的方式,按照 PCA 算法,编程实现对鸢尾花数据的降维处理,将降维后的数据可视化呈现,将降维后的数据保存到文件(csv 格式)
时间: 2024-03-19 16:45:00 浏览: 85
好的,以下是代码实现:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读入鸢尾花数据集
df = pd.read_csv('iris.csv', header=None)
# 将数据转换为NumPy数组
X = df.iloc[:, :-1].values
y = df.iloc[:, -1].values
# 对所有样本进行中心化
X_mean = np.mean(X, axis=0)
X_centered = X - X_mean
# 计算样本的协方差矩阵
cov_matrix = np.cov(X_centered, rowvar=False)
# 对协方差矩阵做特征值分解
eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)
# 将特征向量按照对应的特征值从大到小排序
eig_pairs = [(np.abs(eigenvalues[i]), eigenvectors[:, i]) for i in range(len(eigenvalues))]
eig_pairs.sort(reverse=True)
# 取最大的d个特征值所对应的特征向量
d = 2
w = np.hstack((eig_pairs[i][1].reshape(4, 1)) for i in range(d))
# 计算投影矩阵
X_new = X_centered.dot(w)
# 将降维后的数据和标记合并
data_new = np.hstack((X_new, y.reshape(len(y), 1)))
# 将降维后的数据保存到文件
df_new = pd.DataFrame(data_new, columns=['PC1', 'PC2', 'class'])
df_new.to_csv('iris_pca.csv', index=False)
# 将降维后的数据可视化呈现
plt.scatter(X_new[:, 0], X_new[:, 1], c=y)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.show()
```
解释一下代码的流程:
1. 读入鸢尾花数据集;
2. 将数据转换为 NumPy 数组;
3. 对所有样本进行中心化;
4. 计算样本的协方差矩阵;
5. 对协方差矩阵做特征值分解;
6. 将特征向量按照对应的特征值从大到小排序;
7. 取最大的 d 个特征值所对应的特征向量;
8. 计算投影矩阵;
9. 将降维后的数据和标记合并;
10. 将降维后的数据保存到文件;
11. 将降维后的数据可视化呈现。
降维后的数据保存到了名为 “iris_pca.csv” 的文件中,可在后续的分析中使用。同时,还将降维后的数据可视化呈现,方便我们对数据的理解。
阅读全文