我有要在其上应用PCA的movielens dataset,但是sklearn PCA功能似乎无法正确执行。
我有718 * 8913矩阵,其中行表示用户,列表示电影
这是我的python代码:
加载电影名称和电影评级
movies = pd.read_csv('movies.csv')
ratings = pd.read_csv('ratings.csv')
ratings.drop(['timestamp'], axis=1, inplace=True)
def replace_name(x):
return movies[movies['movieId']==x].title.values[0]
ratings.movieId = ratings.movieId.map(replace_name)
M = ratings.pivot_table(index=['userId'], columns=['movieId'], values='rating')
df1 = M.replace(np.nan, 0, regex=True)
标准化
X_std = StandardScaler().fit_transform(df1)
申请PCA
pca = PCA()
result = pca.fit_transform(X_std)
print result.shape
plt.plot(np.cumsum(pca.explained_variance_ratio_))
plt.xlabel('number of components')
plt.ylabel('cumulative explained variance')
plt.show()
我没有设置任何组件号,因此我希望PCA在新维度中返回718 * 8913矩阵,但pca结果大小为718 * 718,
pca.explained_variance_ratio_
大小为718,并且其所有成员的总和为1,但是如何计算有可能!!!我有8913个特征,它仅返回718,并且它们的方差总和等于1,有人可以解释这里有什么问题吗?
我的情节图片结果:
如您在上图中所见,它仅包含718个分量,总和为1,但是我去了8913个特征?
用较小的示例进行测试
我什至尝试使用scikit学习PCA示例,该示例可以在pca Here is the Link的文档页面中找到。我更改了示例,只是增加了功能数量
import numpy as np
from sklearn.decomposition import PCA
import pandas as pd
X = np.array([[-1, -1,3,4,-1, -1,3,4], [-2, -1,5,-1, -1,3,4,2], [-3, -2,1,-1, -1,3,4,1],
[1, 1,4,-1, -1,3,4,2], [2, 1,0,-1, -1,3,4,2], [3, 2,10,-1, -1,3,4,10]])
ipca = PCA(n_components = 7)
print (X.shape)
ipca.fit(X)
result = ipca.transform(X)
print (result.shape);
在此示例中,我们有6个样本和8个特征,我将
n_components
设置为7,但结果大小为6 * 6。我认为,当功能数量大于样本数量时,scikit学习pca将返回的最大组件数量等于样本数量
最佳答案
请参阅PCA上的documentation。
因为没有将n_components
参数传递给PCA()
,所以sklearn使用min(n_samples, n_features)
作为n_components
的值,这就是为什么要获得等于n_samples的简化特征集的原因。
我相信您的方差等于1,因为您没有在文档中设置n_components
:
如果未设置n_components,则将存储所有组件并求和
解释方差的等于1.0。
关于python - 将sklearn PCA应用于movielens数据集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40849723/