【问题标题】:Principal component analysis using sklearn and panda使用 sklearn 和 panda 进行主成分分析
【发布时间】:2015-09-04 14:42:01
【问题描述】:

我已尝试重现此处 (PCA-tutorial) 上的 PCA 教程的结果,但遇到了一些问题。

  1. 据我了解,我正在按照应有的方式应用 PCA。但是我的结果与教程中的结果不相似(或者它们可能是并且我无法正确解释它们?)。在 n_components=4 的情况下,我得到以下图表n_components4。我可能在某个地方遗漏了一些东西,我还添加了到目前为止的代码。

  2. 我的第二个问题是关于对图中的点进行注释,我有标签,我希望每个点都获得相应的标签。我已经尝试了一些东西,但到目前为止没有成功。

我还添加了数据集,我已将其保存为 CSV:

,奶酪,胴体肉,其他肉类,鱼类,油脂,糖类,新鲜土豆,新鲜蔬菜,其他蔬菜,加工土豆,加工蔬菜,新鲜水果,谷类食品,饮料,软饮料,酒精饮料,糖果 英格兰,105,245,685,147,193,156,720,253,488,198,360,1102,1472,57,1374,375,54 威尔士,103,227,803,160,235,175,874,265,570,203,365,1137,1582,73,1256,475,64 苏格兰,103,242,750,122,184,147,566,171,418,220,337,957,1462,53,1572,458,62 NIreland,66,267,586,93,209,139,1033,143,355,187,334,674,1494,47,1506,135,41

那么对这些问题有什么想法吗?

`

import pandas as pd

import matplotlib.pyplot as plt

from sklearn import decomposition

demo_df = pd.read_csv('uk_food_data.csv')
demo_df.set_index('Unnamed: 0', inplace=True)

target_names = demo_df.index
tran_ne = demo_df.T

pca = decomposition.PCA(n_components=4)
comps = pca.fit(tran_ne).transform(tran_ne)
plt.scatter(comps[0,:], comps[1, :])

plt.title("PCA Analysis UK Food");
plt.xlabel("PC1");
plt.ylabel("PC2");
plt.grid();
plt.savefig('PCA_UK_Food.png', dpi=125)

`

【问题讨论】:

  • 您上传的 csv 文件似乎遗漏了一些“\n”。 pd.read_csv 无法读取它。可以发个原始文件的链接吗?还是使用 pd.to_csv() 保存数据并上传到这里?
  • 哦,当然。这是文件pastebin.com/16DvEjHJ

标签: python pandas scikit-learn pca principal-components


【解决方案1】:

你可以试试这个。

import pandas as pd

import matplotlib.pyplot as plt

from sklearn import decomposition

# use your data file path here
demo_df = pd.read_csv(file_path)
demo_df.set_index('Unnamed: 0', inplace=True)

target_names = demo_df.index.values
tran_ne = demo_df.values

pca = decomposition.PCA(n_components=4)
pcomp = pca.fit_transform(tran_ne)
pcomp1 = pcomp[:,0]

fig, ax = plt.subplots()
ax.scatter(x=pcomp1[0], y=0, c='r', label=target_names[0])
ax.scatter(x=pcomp1[1], y=0, c='g', label=target_names[1])
ax.scatter(x=pcomp1[2], y=0, c='b', label=target_names[2])
ax.scatter(x=pcomp1[3], y=0, c='k', label=target_names[3])
ax.legend(loc='best')

【讨论】:

  • 我认为这不是正确的方法。就像在setosa.io/ev/principal-component-analysis (英国饮食部分)的示例中一样,维度是食品类别,观察是英国的 4 个国家。所以它应该看起来像那个教程上的图表。 Buuuut 我搞砸了,价值观都错了。
  • 同意。抱歉,是我的错。很快就会纠正这个问题。
  • 事情就是这样。数据是 17 维(特征),用于 4 次观察。那么你不应该在 demo_df.T 中通过 use transpose。在 scikit-learn 中,假设每个特征是一列,每个 obs 是一行。
  • 好的,谢谢。你说的对。我看得太多了,有点晚了。另外,我并不完全想在图表上添加文本,我希望每个点都有一个标签,就像示例中的图表一样。我这样试过: plt.figure() for c,target_name in zip('r', target_names): plt.scatter(comps[:, 0], comps[:, 1], c=c, label=target_name ) 但它只需要颜色,而不是标签......
猜你喜欢
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 2016-02-05
  • 1970-01-01
  • 2014-06-10
相关资源
最近更新 更多