def projectData(X, U, K): m = X.shape[0] U_reduced = U[:,:K] Z = np.zeros((m,K)) for i in range(m): for j in range(K): Z[i,j] = X[i,:] @ U_reduced[:,j] return Z
时间: 2023-06-26 13:06:01 浏览: 74
这是一个实现主成分分析(PCA)的函数。给定原始数据矩阵 X,已经通过奇异值分解(SVD)得到的左奇异矩阵 U,以及要保留的主成分个数 K,该函数返回一个降维后的数据矩阵 Z。具体地,对于每个样本向量 X[i],该函数将其投影到 K 个主成分上得到一个 K 维向量,组成新的降维后的数据矩阵 Z。
具体地,该函数的实现过程为:
1. 首先从 U 中取出前 K 个左奇异向量,组成一个 K×n 的矩阵,其中 n 是 X 的特征维数。
2. 对于每个样本向量 X[i],将其与 U_reduced 的每一列做内积得到一个 K 维向量,即为该样本在 K 个主成分上的投影。
3. 将所有的投影向量组合成一个 m×K 的矩阵 Z,即为降维后的数据矩阵。
需要注意的是,该函数假设输入的 X 和 U 已经被中心化过,即每个特征的均值为 0。如果没有中心化,需要在调用该函数之前先对 X 进行中心化处理。
相关问题
def recoverData(Z, U, K): """ Recovers an approximation of the original data when using the projected data """ m,n = Z.shape[0],U.shape[0] X_rec = np.zeros((m,n)) U_reduced = U[:,:K] for i in range(m): X_rec[i,:] = Z[i,:] @ U_reduced.T return X_rec
这是一个 Python 函数,用于从经过投影的数据 Z 和降维后的特征向量 U 中恢复近似原始数据。K 是降维后使用的特征向量数量。具体来说,函数首先创建一个大小为 (m,n) 的零矩阵 X_rec,其中 m 是样本数,n 是特征数。然后,它从 U 中选择前 K 个特征向量,将其存储在 U_reduced 中。接下来,函数遍历每个样本,将其对应的投影数据 Z[i,:] 与 U_reduced.T 相乘,并将结果存储在 X_rec[i,:] 中。最后,函数返回 X_rec。
jupyterPCA实验:对data.csv文件中的数据实现PCA操作并实现维度恢复1.数据读取及处理 2.特征归一化 3.计算协方差矩阵Sigma = □1/m∑_i=0^m▒(x^(i))(x^(i))^T 4.奇异值分解[U, S, V] = svd(Sigma) 5.Ureduce = U(:, 1:k) 6. z = Ureduceʼ * x7.绘图
好的,这是对数据集进行 PCA 操作的完整代码:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 1.数据读取及处理
data = pd.read_csv("data.csv", header=None)
X = data.values.T
m, n = X.shape
# 2.特征归一化
def feature_normalize(X):
mu = np.mean(X, axis=1)
sigma = np.std(X, axis=1, ddof=1)
X_norm = (X - mu.reshape(-1, 1)) / sigma.reshape(-1, 1)
return X_norm, mu, sigma
X_norm, mu, sigma = feature_normalize(X)
# 3.计算协方差矩阵 Sigma
Sigma = 1 / m * X_norm.dot(X_norm.T)
# 4.奇异值分解[U, S, V] = svd(Sigma)
U, S, V = np.linalg.svd(Sigma)
# 5.Ureduce = U(:, 1:k)
k = 1 # 恢复到1维
U_reduce = U[:, :k]
# 6. z = Ureduceʼ * x
Z = U_reduce.T.dot(X_norm)
# 维度恢复
X_approx = U_reduce.dot(Z)
# 绘图
fig, ax = plt.subplots(figsize=(12, 8))
ax.set_aspect('equal')
ax.scatter(X[0], X[1], c='b', marker='o')
ax.scatter(X_approx[0], X_approx[1], c='r', marker='o')
plt.xlabel('x1')
plt.ylabel('x2')
plt.title('Original Data Points vs. PCA Reduced Data Points')
plt.show()
```
请注意,我将 k 设置为 1,因此维度恢复到了 1 维。如果您想恢复到其他维度,请相应地更改 k 的值。
阅读全文