2013-08-18 6 views
7

के साथ पीसीए के लिए मूल उदाहरण matplotlib.mlab.PCA के साथ एक साधारण प्रिंसिपल घटक विश्लेषण करने की कोशिश कर रहा है लेकिन कक्षा के गुणों के साथ मुझे अपनी समस्या का एक साफ समाधान नहीं मिल सकता है। यहाँ एक उदाहरण है:matplotlib

2 डी में कुछ डमी डेटा प्राप्त करें और पीसीए शुरू:

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

उत्तर

22

मुझे नहीं लगता कि mlab.PCA वर्ग कि आप क्या करना चाहते हैं के लिए उपयुक्त है। इस तरह

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

यह eigenvectors में परिणाम है, pca.Wt,:

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

center विधि sigma द्वारा विभाजित करता है:

[[-0.70710678 -0.70710678] 
[-0.70710678 0.70710678]] 
विशेष रूप से, PCA वर्ग eigenvectors खोजने से पहले डेटा rescales

वे लंबवत हैं, लेकिन आपके मूल डेटा के मूल अक्षों से सीधे प्रासंगिक नहीं हैं। वे मालिश डेटा के संबंध में प्रमुख अक्ष हैं।

शायद यह आपके द्वारा सीधे तौर चाहते कोड करने के लिए (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

+0

महान है, धन्यवाद। यही वह है जिसे मैं ढूंढ रहा था। – Tyrax

+0

1.618 निरंतर का अर्थ क्या है? जहाँ से यह आया ? – joaquin

+1

@ जोआक्विन: इसका लगभग [सुनहरा अनुपात] (http://en.wikipedia.org/wiki/Golden_ratio)। आप, निश्चित रूप से, अपनी पसंद के किसी भी स्थिरता का चयन कर सकते हैं, लेकिन यह [अक्सर अच्छा दिखता है] (http://en.wikipedia.org/wiki/Golden_ratio#Painting)। – unutbu