Pandas 计算sklearn'的第一主成分;s主成分分析
我有以下代码,它成功地计算了我的数据的最大主成分:Pandas 计算sklearn'的第一主成分;s主成分分析,pandas,numpy,scikit-learn,pca,Pandas,Numpy,Scikit Learn,Pca,我有以下代码,它成功地计算了我的数据的最大主成分: lst = ['date', 'MA(1,9)', 'MA(1,12)', 'MA(2,9)', 'MA(2,12)', 'MA(3,9)', 'MA(3,12)', 'MOM(9)', 'MOM(12)', 'VOL(1,9)', 'VOL(1,12)', 'VOL(2,9)', 'VOL(2,12)', 'VOL(3,9)', 'VOL(3,12)'] df = pd.read_excel(filename, sheet_name='dai
lst = ['date', 'MA(1,9)', 'MA(1,12)', 'MA(2,9)', 'MA(2,12)', 'MA(3,9)', 'MA(3,12)', 'MOM(9)', 'MOM(12)', 'VOL(1,9)', 'VOL(1,12)', 'VOL(2,9)', 'VOL(2,12)', 'VOL(3,9)', 'VOL(3,12)']
df = pd.read_excel(filename, sheet_name='daily', header=0, names=lst)
df = df.set_index('date')
df = df.loc[start_date:end_date]
pca = PCA()
pca = pca.fit(df)
print(pca.components_)
#print(pca.explained_variance_[0])
df = pd.DataFrame(pca.transform(df), columns=['PCA%i' % i for i in range(14)], index=df.index)
有没有办法不必自己计算就能成功地得到第一个主成分?(sklearn是否有我找不到的属性?)
我的数据:
MA(1,9) MA(1,12) MA(2,9) MA(2,12) MA(3,9) MA(3,12) MOM(9) \
date
1990-06-08 1 1 1 1 1 1 1
1990-06-11 1 1 1 1 1 1 1
1990-06-12 1 1 1 1 1 1 1
1990-06-13 1 1 1 1 1 1 1
1990-06-14 1 1 1 1 1 1 1
MOM(12) VOL(1,9) VOL(1,12) VOL(2,9) VOL(2,12) VOL(3,9) \
date
1990-06-08 1 1 0 1 1 1
1990-06-11 1 1 1 1 1 1
1990-06-12 1 0 0 1 1 1
1990-06-13 1 0 0 1 1 1
1990-06-14 1 0 0 1 1 1
VOL(3,12)
date
1990-06-08 1
1990-06-11 1
1990-06-12 1
1990-06-13 1
1990-06-14 1
输出:
PCA0 PCA1 PCA2 PCA3 PCA4 PCA5 \
date
1990-06-08 -0.707212 0.834228 0.511333 0.104279 -0.055340 -0.117740
1990-06-11 -0.685396 1.224009 -0.059560 -0.038864 -0.011676 -0.031021
1990-06-12 -0.737770 0.445458 1.083377 0.237313 -0.075061 0.012465
1990-06-13 -0.737770 0.445458 1.083377 0.237313 -0.075061 0.012465
1990-06-14 -0.737770 0.445458 1.083377 0.237313 -0.075061 0.012465
1990-06-15 -0.715954 0.835239 0.512485 0.094170 -0.031397 0.099184
1990-06-18 -0.715954 0.835239 0.512485 0.094170 -0.031397 0.099184
1990-06-19 -0.702743 -0.024860 0.185254 -0.976475 -0.028151 0.090701
... ... ... ... ... ... ...
2015-05-01 -0.636410 -0.440222 -1.139295 -0.229937 0.088941 -0.055738
2015-05-04 -0.636410 -0.440222 -1.139295 -0.229937 0.088941 -0.055738
PCA6 PCA7 PCA8 PCA9 PCA10 PCA11 \
date
1990-06-08 -0.050111 0.000652 0.062524 0.066524 -0.683963 0.097497
1990-06-11 -0.053740 0.013313 0.008949 -0.006157 0.002628 -0.010517
1990-06-12 -0.039659 -0.029781 0.009185 -0.026395 -0.006305 -0.019026
1990-07-19 -0.053740 0.013313 0.008949 -0.006157 0.002628 -0.010517
1990-07-20 -0.078581 0.056345 0.386847 0.056035 -0.044696 0.013128
... ... ... ... ... ... ...
2015-05-01 0.066707 0.018254 0.009552 0.002706 0.008036 0.000745
2015-05-04 0.066707 0.018254 0.009552 0.002706 0.008036 0.000745
PCA12 PCA13
date
1990-06-08 0.013466 -0.020638
... ... ...
2015-05-04 0.001502 0.004461
上面是更新代码的输出,但它似乎是错误的输出。“第一主成分”定义为:
此转换的定义方式是,第一个主成分>具有最大的可能方差(即,尽可能多地解释数据中的>可变性),并且在与>之前的成分正交的约束下,每个后续成分依次具有>最大的可能方差
简单地抓取PCA的第一列是否与上述定义的过程相同?您始终可以使用
PCA().fit_transform(df).iloc[:,0]
,这将为每一行提供第一个PC轴上的值。PCA对象有一个成员components.
,它在调用fit()
后保存组件
从:
组件:阵列、形状(n个组件、n个特征)
特征空间中的主轴,表示数据中最大方差的方向。组件按解释的
排序
例如:
将熊猫作为pd导入
将numpy作为np导入
将matplotlib.pyplot作为plt导入
从sklearn.decomposition导入PCA
np.随机种子(42)
df=pd.DataFrame(np.concatenate([np.random.rand(50,5),np.random.rand(50,5)+1]))
pca=pca(n_分量=2)。拟合(df)
打印(主成分分析组件)
输出:要素空间中的两个组件
[[-0.43227251 -0.47497776 -0.41079902 -0.47411737 -0.44044691]
[ 0.41214174 -0.54429826 -0.55429329 0.34990399 0.32280758]]
说明:
如文档中所述,这些向量已按其
解释的方差
排序。这意味着通过抓取第一个向量pca.components\u0]
您将收到方差最高的向量(由pca.explained\u0]
给出)
这是可以想象的。正如您在上面的代码中所看到的,我们希望找到方差最高的两个分量(
PCA(n_components=2)
)。通过进一步调用pca.transform(df)
我们要做的是将数据投影到这些组件上。这将导致矩阵(n_个样本,n_个组件)
的大小-这也意味着我们可以绘制此图
我们也可以变换pca.components给出的向量,以便在低维空间中观察这两个分量。为了使绘图更有意义,我首先将变换后的组件规格化为1的长度,并通过其解释的方差进一步缩放,以突出其重要性
t = pca.transform(df)
ax = plt.figure().gca()
ax.scatter(t[:,0], t[:,1], s=5)
transf_components = pca.transform(pca.components_)
for i, (var, c) in enumerate(zip(pca.explained_variance_, transf_components)):
# The scaling of the transformed components for the purpose of visualization
c = var * (c / np.linalg.norm(c))
ax.arrow(0, 0, c[0], c[1], head_width=0.06, head_length=0.08, fc='r', ec='r')
ax.annotate('Comp. {0}'.format(i+1), xy=c+.08)
plt.show()
给出:
特别更新: 在评论区与您聊天后:也许可以看看(): 请注意,
df
现在是一个具有二进制值的矩阵(与原始数据一样)
将熊猫作为pd导入
将numpy作为np导入
将matplotlib.pyplot作为plt导入
从sklearn.decomposition导入因子分析
np.随机种子(42)
n_特征=20
#50个样本后,我们“改变行为”
df=pd.DataFrame(1*np.concatenate([np.random.rand(50,n_特征)>.25,
np.random.rand(50,n_特征>0.75]))
#我在这里选择n_组件完全是任意的(
输出:
PCA0 PCA1 PCA2 PCA3 PCA4 PCA5 \
date
1990-06-08 -0.707212 0.834228 0.511333 0.104279 -0.055340 -0.117740
1990-06-11 -0.685396 1.224009 -0.059560 -0.038864 -0.011676 -0.031021
1990-06-12 -0.737770 0.445458 1.083377 0.237313 -0.075061 0.012465
1990-06-13 -0.737770 0.445458 1.083377 0.237313 -0.075061 0.012465
1990-06-14 -0.737770 0.445458 1.083377 0.237313 -0.075061 0.012465
1990-06-15 -0.715954 0.835239 0.512485 0.094170 -0.031397 0.099184
1990-06-18 -0.715954 0.835239 0.512485 0.094170 -0.031397 0.099184
1990-06-19 -0.702743 -0.024860 0.185254 -0.976475 -0.028151 0.090701
... ... ... ... ... ... ...
2015-05-01 -0.636410 -0.440222 -1.139295 -0.229937 0.088941 -0.055738
2015-05-04 -0.636410 -0.440222 -1.139295 -0.229937 0.088941 -0.055738
PCA6 PCA7 PCA8 PCA9 PCA10 PCA11 \
date
1990-06-08 -0.050111 0.000652 0.062524 0.066524 -0.683963 0.097497
1990-06-11 -0.053740 0.013313 0.008949 -0.006157 0.002628 -0.010517
1990-06-12 -0.039659 -0.029781 0.009185 -0.026395 -0.006305 -0.019026
1990-07-19 -0.053740 0.013313 0.008949 -0.006157 0.002628 -0.010517
1990-07-20 -0.078581 0.056345 0.386847 0.056035 -0.044696 0.013128
... ... ... ... ... ... ...
2015-05-01 0.066707 0.018254 0.009552 0.002706 0.008036 0.000745
2015-05-04 0.066707 0.018254 0.009552 0.002706 0.008036 0.000745
PCA12 PCA13
date
1990-06-08 0.013466 -0.020638
... ... ...
2015-05-04 0.001502 0.004461
啊,既然它们已经被排序了,我就可以抓住每个子列表的第一个元素,这就是我每行的第一个主成分?@evaristegalois
pca.components\u0]
将是第一个分量,依此类推。pca.components\u0]
是一个列表,所以不是pca.components\u0][0]
将是第一个分量?@不,整个向量是(主)分量。正如文档所述(n_组件,n_功能)。我对我的答案做了一些修改,以使它们形象化。因此,我试图得到6275行的主成分,每行14个成分,我用代码更新了OP,我相信你在这里为我解释了这一点,但是输出结果似乎很不理想。我遗漏了什么吗?第一主成分并不意味着轴上的第一个值,它当然有一个特定的定义,但既然你已经从你的问题中了解了。成分
,我想你是在寻找第一个PC轴上的数据点的值,因为你已经在打印主分量,并在最后两行中将数据转换到PC空间。但是,如果你只是在寻找主分量本身,那就是——正如Stefan Falk正确指出的那样——PCA.components_[0]