구현 - python pca 예제



matplotlib가있는 PCA의 기본 예제 (1)

나는 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()

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

이제는 기본 구성 요소를 원래 좌표의 벡터로 가져 와서 데이터로 화살표로 그려 봅니다.

거기에 도착하는 빠르고 깨끗한 방법은 무엇입니까?

고마워, Tyrax





pca