我尝试使用matplotlib.mlab.PCA进行简单的主成分分析但是使用类的属性我无法得到一个干净的解决方案来解决我的问题.这是一个例子:
在2D中获取一些虚拟数据并启动PCA:
from matplotlib.mlab import PCA
import numpy as np
N = 1000
xTrue = np.linspace(0,1000,N)
yTrue = 3*xTrue
xData = xTrue + np.random.normal(0, 100, N)
yData = yTrue + np.random.normal(0, 100, N)
xData = np.reshape(xData, (N, 1))
yData = np.reshape(yData, (N, 1))
data = np.hstack((xData, yData))
test2PCA = PCA(data)
Run Code Online (Sandbox Code Playgroud)
现在,我只想将主要组件作为原始坐标中的向量,并将它们绘制为我的数据上的箭头.
什么是快速而干净的方式到达那里?
谢谢Tyrax
我正在使用PCA来减少N维数据集的维数,但是我想对较大的离群值建立鲁棒性,因此我一直在研究稳健的PCA代码。
对于传统的PCA,我使用的是python的sklearn.decomposition.PCA,它将主成分很好地返回为向量,然后可以将我的数据投影到该向量上(要清楚,我还使用SVD编写了自己的版本,因此我知道该方法有效)。我在那里找到了一些预编码的RPCA python代码(例如https://github.com/dganguli/robust-pca和https://github.com/jkarnows/rpcaADMM)。
第一个代码基于Candes等人。(2009)方法,并返回数据集D的低秩L和稀疏S矩阵。第二代码使用矩阵分解的ADMM方法(Parikh,N.,&Boyd,S. 2013)并返回X_1,X_2,X_3矩阵。我必须承认,我很难弄清楚如何将它们连接到标准PCM算法返回的主轴上。谁能提供任何指导?
具体来说,在一个数据集X中,我有N个3-D点组成的云。我通过PCA运行它:
pca=sklean.decompose.PCA(n_components=3)
pca.fit(X)
comps=pca.components_
Run Code Online (Sandbox Code Playgroud)
这3个分量是3D矢量,它们定义了我将所有点投影到的新基础。使用健壮的PCA,我得到的矩阵L + S = X。然后执行pca.fit(L)吗?我本以为RPCA会给我本征向量,但是在建立协方差矩阵或执行SVD的过程中,有内部步骤可以剔除异常值。
也许我认为“健壮的PCA”不是别人使用/编码的方式吗?
我尝试制作一个程序,根据参与者的点击绘制热图。有两个身体,情绪有增有减。
我想用蓝色显示左侧身体的点击强度(蓝色更强烈=点击次数更多),用红色显示右侧身体的点击强度。
问题是我需要在一个主体中显示它,并且还需要在背景图像上看到热图。
x=blue[:,1]
y=blue[:,2]
ax = plt.gca()
heatmap, xedges, yedges = np.histogram2d(x, y, bins=50)
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
plt.imshow(heatmap.T, extent=extent, origin='lower')
ax = plt.gca()
ax.invert_yaxis()
plt.show()
x1=red[:,1]
y1=red[:,2]
ax = plt.gca()
heatmap, xedges, yedges = np.histogram2d(x1, y1, bins=50)
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
plt.clf()
plt.imshow(heatmap.T, extent=extent, origin='lower')
ax = plt.gca()
ax.invert_yaxis()
plt.show()
plt.imshow(image)
imageFile = cbook.get_sample_data('C:\\Users\\Admin\\Desktop\\pythonpca\\result.png')
image = plt.imread(imageFile)
plt.plot(all_samples[0:240,0],all_samples[0:240,1], 'o', markersize=3, color='blue', alpha=0.5, label='increase')
plt.imshow(image)
Run Code Online (Sandbox Code Playgroud)
通过这个,我得到了左侧身体点击的热图、右侧身体点击的热图以及左侧和右侧身体的图片。我希望它们都在同一张图片中,带有蓝色和红色热点。我附上我得到的图片。
2张尸体图片(我在上面画了蓝点,但我不需要这些点):

左右身体的热图:

如果我应该添加更多信息,请告诉我。
根据这个任务:
我包括了这一行
import from matplotlib.mlab import PCA
Run Code Online (Sandbox Code Playgroud)
但我收到错误消息:
无法从“matplotlib.mlab”导入名称“PCA”
我正在使用 Python3.7,我不知道如何使用 matlab 中的 PCA 函数。新版本的 matplotlib 是否已弃用,或者 PCA 是否包含在另一个库中?