我在Python中使用PCA来降低数据的维度。当前数据有768行和10列。
我使用以下代码来实现PCA:
import numpy as npfrom sklearn import decompositiondemo_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行。
为什么数据中少了一行?
回答:
是的,你的理解是正确的。但在将demo_df传递给PCA之前,请检查一下它的形状。它应该是767的长度。PCA不会从你的数据中删除任何样本。
差异来源于read_csv()
的使用。请查看pandas.read_csv()的文档。它有一个参数header
,其描述如下:
header : int或int列表,默认值为’infer’
用作列名的行号,以及数据的开始位置。如果未传递名称,默认行为如同设置为0,否则为None。显式传递header=0可以替换现有名称。header可以是一个整数列表,用于指定列上的多索引的行位置,例如[0,1,3]。未指定的中间行将被跳过(例如,在此示例中2被跳过)。请注意,如果skip_blank_lines=True,此参数将忽略注释行和空行,因此header=0表示数据的第一行而不是文件的第一行。
它默认使用文件的第一行作为列标题,如果未通过另一个参数names
明确提供这些标题的话。
所以,如果你不想使用文件的第一行作为列标题,你应该在read_csv()中传递header = None
,如下所示:
demo_df = pd.read_csv('data.csv', header = None)