Tyr*_*rax 11 python matplotlib pca
我尝试使用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
unu*_*tbu 27
我不认为这个mlab.PCA课程适合你想做的事情.特别是,PCA该类在找到特征向量之前重新调整数据:
a = self.center(a)
U, s, Vh = np.linalg.svd(a, full_matrices=False)
Run Code Online (Sandbox Code Playgroud)
该center方法除以sigma:
def center(self, x):
'center the data using the mean and sigma from training set a'
return (x - self.mu)/self.sigma
Run Code Online (Sandbox Code Playgroud)
这导致特征向量pca.Wt,如下所示:
[[-0.70710678 -0.70710678]
[-0.70710678 0.70710678]]
Run Code Online (Sandbox Code Playgroud)
它们是垂直的,但与原始数据的主轴不直接相关.它们是按摩数据的主要轴.
也许直接编写你想要的东西可能更容易(不使用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()
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
20537 次 |
| 最近记录: |