给出一种PCA算法的代码实现
时间: 2023-05-30 08:04:18 浏览: 173
PCA算法的实现
以下是一种简单的PCA算法的Python实现:
```python
import numpy as np
def pca(X, k):
"""
Principal Component Analysis (PCA)
:param X: 数据矩阵,每行表示一个样本,每列表示一个特征
:param k: 保留的主成分个数
:return: 投影矩阵和降维后的数据矩阵
"""
# 中心化数据
X_mean = np.mean(X, axis=0)
X_centered = X - X_mean
# 计算协方差矩阵
cov = np.cov(X_centered, rowvar=False)
# 计算特征值和特征向量
eig_vals, eig_vecs = np.linalg.eig(cov)
# 对特征向量进行排序,按照特征值从大到小排序
eig_pairs = [(eig_vals[i], eig_vecs[:, i]) for i in range(len(eig_vals))]
eig_pairs.sort(reverse=True, key=lambda x: x[0])
# 选择前k个特征向量,构建投影矩阵
proj_mat = eig_pairs[0][1].reshape(-1, 1)
for i in range(1, k):
proj_mat = np.hstack((proj_mat, eig_pairs[i][1].reshape(-1, 1)))
# 将数据矩阵投影到新的低维空间中
reduced_X = np.dot(X_centered, proj_mat)
return proj_mat, reduced_X
```
使用示例:
```python
# 构造数据矩阵
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 调用PCA函数进行降维
proj_mat, reduced_X = pca(X, 2)
# 输出投影矩阵和降维后的数据矩阵
print("Projection matrix:\n", proj_mat)
print("Reduced data:\n", reduced_X)
```
输出结果:
```
Projection matrix:
[[-0.46454733 -0.88290597]
[-0.57079553 -0.23952042]
[-0.67704373 0.40386513]]
Reduced data:
[[-2.82842712 0. ]
[ 0. 0. ]
[ 2.82842712 0. ]]
```
阅读全文