在movielens数据集上应用sklearn PCA

时间:2016-11-28 17:04:10

标签: python scikit-learn pca

我有电影版本dataset,我想在其上应用PCA,但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可以解释这里有什么问题吗?
我的情节图片结果: enter image description here 正如你在上面的图片中看到的,它只包含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个feauters我将n_components设置为7但结果大小为6 * 6。  我认为当特征数量大于样本数量时,scikit学习pca将返回的最大组件数量等于样本数量

1 个答案:

答案 0 :(得分:1)

请参阅PCA上的documentation。 由于您未将n_components参数传递给PCA(),因此sklearn使用min(n_samples, n_features)作为n_components的值,这就是为什么您获得的缩减功能集等于n_samples。< / p>

我认为你的方差等于1,因为你没有从文档中设置n_components

  

如果未设置n_components,则存储所有组件和总和   解释的方差等于1.0。