2017-05-04 42 views
1

我在Python中使用PCA来减少我拥有的数据的维数。目前的数据有768行和10列。PCA:结果矩阵n-1行

我使用下面的代码来实现PCA:

import numpy as np 
from sklearn import decomposition 

demo_df = pd.read_csv('data.csv') 
pca = decomposition.PCA(n_components=4) 

comps = pca.fit(demo_df).transform(demo_df) 

np.savetxt('data_reduced.csv', comps, delimiter=',') 

根据我的理解所产生的文件应包含768行4列(因为n_components = 4)。

但得到的数据有N-1行即767

为什么一行从数据丢失?

回答

3

是的,你的理解是正确的。但在传递给PCA之前请检查demo_df的形状。它的长度必须是767.PCA不会从您的数据中删除任何样本。

不同之处在于使用read_csv()。请看documentation of pandas.read_csv()。它有一个参数header及其描述是如下:

头:int或整数的列表,默认的“推断”

行号(一个或多个),以作为 使用列名,并开始的数据。如果没有名字传递,默认行为就好像 设置为0,否则为无。显式传递header = 0 以能够替换现有名称。标题可以是列表 的整数的列表,其指定列 上的多索引的行位置。 [0,1,3]。未指定的中间行将被跳过 (例如,在此示例中跳过2)。请注意,如果skip_blank_lines = True,则此参数忽略 注释行和空行,因此header = 0 表示数据的第一行,而不是文件的第一行。

它通过默认使用文件的第一行作为列标题,如果不通过使用另一个参数names的明确提供的那些标题。

所以,如果你不想使用你的文件作为列标题的第一行,你应该通过在read_csv的header = None()这样的:

demo_df = pd.read_csv('data.csv', header = None)