【问题标题】:apply sklearn PCA on movielens dataset在movielens数据集上应用sklearn PCA
【发布时间】:2017-04-12 11:53:15
【问题描述】:

我有 movielens 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()
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 learn 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 个 fauters,我将 n_components 设置为 7,但结果大小为 6*6。
我认为当特征数大于样本数时scikit learn pca 将返回的最大组件数等于样本数

【问题讨论】:

    标签: python scikit-learn pca


    【解决方案1】:

    请参阅 PCA 上的 documentation。 因为您没有将n_components 参数传递给PCA(),所以sklearn 使用min(n_samples, n_features) 作为n_components 的值,这就是您得到一个等于n_samples 的缩减特征集的原因。

    我相信您的方差等于 1,因为您没有从文档中设置 n_components

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

    【讨论】:

    • 我厌倦了 n_components 每个大于 718 的 n_components 都不起作用,它最终返回 718 个组件
    • 这里的答案似乎表明,从根本上说,PCA 可以减少到的最大维数是 min(n_samples, n_features):stackoverflow.com/questions/22557883/…
    猜你喜欢
    • 2018-09-11
    • 2019-01-23
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2019-05-02
    • 2020-12-22
    • 2021-03-24
    • 2013-12-25
    相关资源
    最近更新 更多