gpt4 book ai didi

python - 使用 matplotlib 进行 PCA 的基本示例

转载 作者:太空狗 更新时间:2023-10-29 18:16:49 26 4
gpt4 key购买 nike

我尝试使用 matplotlib.mlab.PCA 进行简单的主成分分析,但是使用该类的属性我无法获得解决问题的干净方法。这是一个例子:

获取一些二维虚拟数据并启动 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)

现在,我只想将主成分作为原始坐标中的向量,并将它们作为箭头绘制到我的数据上。

什么是到达那里的快速而干净的方法?

谢谢,泰拉克斯

最佳答案

我认为 mlab.PCA 类不适合您要执行的操作。特别是,PCA 类在找到特征向量之前重新缩放数据:

a = self.center(a)
U, s, Vh = np.linalg.svd(a, full_matrices=False)

center 方法除以sigma:

def center(self, x):
'center the data using the mean and sigma from training set a'
return (x - self.mu)/self.sigma

这会产生特征向量,pca.Wt,如下所示:

[[-0.70710678 -0.70710678]
[-0.70710678 0.70710678]]

它们与原始数据的主轴垂直,但不直接相关。它们是按摩数据的主轴。

也许直接编写您想要的代码(不使用 mlab.PCA 类)可能更容易:

import numpy as np
import matplotlib.pyplot as plt

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))

mu = data.mean(axis=0)
data = data - mu
# data = (data - mu)/data.std(axis=0) # Uncommenting this reproduces mlab.PCA results
eigenvectors, eigenvalues, V = np.linalg.svd(data.T, full_matrices=False)
projected_data = np.dot(data, eigenvectors)
sigma = projected_data.std(axis=0).mean()
print(eigenvectors)

fig, ax = plt.subplots()
ax.scatter(xData, yData)
for axis in eigenvectors:
start, end = mu, mu + sigma * axis
ax.annotate(
'', xy=end, xycoords='data',
xytext=start, textcoords='data',
arrowprops=dict(facecolor='red', width=2.0))
ax.set_aspect('equal')
plt.show()

enter image description here

关于python - 使用 matplotlib 进行 PCA 的基本示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18299523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com