我如何获得 PCA 应用程序的特征值和特征向量?
from sklearn.decomposition import PCA
clf=PCA(0.98,whiten=True) #converse 98% variance
X_train=clf.fit_transform(X_train)
X_test=clf.transform(X_test)
我在 文档 中找不到它。
1.我“不”能够理解不同的结果在这里。
编辑 :
def pca_code(data):
#raw_implementation
var_per=.98
data-=np.mean(data, axis=0)
data/=np.std(data, axis=0)
cov_mat=np.cov(data, rowvar=False)
evals, evecs = np.linalg.eigh(cov_mat)
idx = np.argsort(evals)[::-1]
evecs = evecs[:,idx]
evals = evals[idx]
variance_retained=np.cumsum(evals)/np.sum(evals)
index=np.argmax(variance_retained>=var_per)
evecs = evecs[:,:index+1]
reduced_data=np.dot(evecs.T, data.T).T
print(evals)
print("_"*30)
print(evecs)
print("_"*30)
#using scipy package
clf=PCA(var_per)
X_train=data.T
X_train=clf.fit_transform(X_train)
print(clf.explained_variance_)
print("_"*30)
print(clf.components_)
print("__"*30)
- 我希望获得所有特征值和特征向量,而不仅仅是具有收敛条件的约简集。
好的,以下是获取 sklearn.decomposition.PCA 对象中的特征值和特征向量,以及理解不同结果的原因的解释:
1. 获取特征值和特征向量
可以在拟合 PCA 对象后,使用以下属性访问特征值和特征向量:
-
explained_variance_
: 这给出了每个主成分的解释方差。这些值表示每个主成分捕获的数据方差量。它们对应于特征值。 -
components_
: 这提供了主成分。每个主成分的系数按解释方差的降序排列(第一主成分在第一列,依此类推)。这些对应于特征向量。
2. 理解结果的差异
代码中
pca_code
函数和
sklearn
的 PCA 类之间的结果差异可能是由于以下一个或多个因素造成的:
-
数据标准化:
sklearn
的 PCA 类默认情况下不进行标准化。但是,的pca_code
函数通过以下方式对数据进行标准化:python data -= np.mean(data, axis=0) data /= np.std(data, axis=0)
此标准化步骤会影响计算的协方差矩阵和最终的特征值和特征向量。为了使结果一致,应该在将数据传递给PCA
类之前对其进行标准化,或者在pca_code
函数中禁用标准化。 -
特征向量排序:
pca_code
函数和PCA
类都按解释方差的降序对特征值(和对应的特征向量)进行排序。但是,可能存在由于数值精度或用于计算特征值和特征向量的特定算法而导致的微小差异,这可能会导致顺序略有不同。 -
特征向量符号: 特征向量定义为相对于原点的方向。因此,特征向量可以按其负值或正值进行缩放,并且仍然代表相同的主成分。
pca_code
函数和PCA
类可能会为某些特征向量返回不同的符号,但这不会影响结果。
3. 获取所有特征值和特征向量
默认情况下,
sklearn
的 PCA 类会返回与指定的方差阈值或组件数相对应的主成分(特征值和特征向量)。
要获得所有特征值和特征向量,无论解释的方差如何,应该在初始化
PCA
对象时将
n_components
参数设置为
None
或大于或等于特征数量的值。
例如:
clf = PCA(n_components=None) # 或 n_components=data.shape[1]
X_train = clf.fit_transform(X_train)
这将导致
PCA
对象计算所有主成分,并且可以使用
explained_variance_
和
components_
属性访问所有特征值和特征向量。
更正后的代码
以下是已更正的代码,用于获取所有特征值和特征向量,以及标准化数据的选项:
import numpy as np
from sklearn.decomposition import PCA
def pca_code(data, standardize=True):
if standardize:
data -= np.mean(data, axis=0)
data /= np.std(data, axis=0)
cov_mat = np.cov(data, rowvar=False)
evals, evecs = np.linalg.eigh(cov_mat)
idx = np.argsort(evals)[::-1]
evecs = evecs[:, idx]
evals = evals[idx]
return evals, evecs
# 示例用法
data = np.random.rand(100, 5) # 100 个样本,5 个特征
# 使用 pca_code 函数
evals, evecs = pca_code(data)
print("pca_code - 特征值:", evals)
print("pca_code - 特征向量:", evecs)
print("_"*30)
# 使用 sklearn 的 PCA 类
clf = PCA(n_components=None) # 计算所有主成分
clf.fit(data)
print("PCA - 解释方差(特征值):", clf.explained_variance_)
print("PCA - 成分(特征向量):", clf.components_)
这将打印出使用
pca_code
函数和
sklearn
的
PCA
类计算的所有特征值和特征向量。