In [1]:
import numpy as np
from numpy import linalg
import numpy.random as npr
import pylab as pl
%matplotlib inline
Goal:
Building blocks:
In [ ]:
# example of what should come out: PCA
In [2]:
import sklearn
In [3]:
from sklearn import datasets
In [9]:
X = datasets.make_swiss_roll(1000,0.05)[0]
In [10]:
X.shape
Out[10]:
In [11]:
from sklearn.decomposition import PCA
In [26]:
pca = PCA(2)
In [27]:
y = pca.fit_transform(X)
In [28]:
X2 = pca.inverse_transform(y)
In [29]:
np.sum(np.abs(X2-X))
Out[29]:
In [30]:
np.mean(X,0)
Out[30]:
In [34]:
cov = np.cov(X,rowvar=0)
cov.shape
Out[34]:
In [39]:
W = linalg.eig(cov)[1]
W
Out[39]:
In [47]:
y = W.dot(X.T)
In [79]:
def transform(X,dim=2):
#mean = np.mean(X,0)
cov = np.cov(X,rowvar=0)
evals,evecs = linalg.eig(cov)
W = evecs[:dim]
return W.dot(X.T).T
In [107]:
X = npr.randn(1000,2)
X[:,0] += npr.rand(1000)*20-10
X[:,1] += X[:,0] + 0.05*X[:,0]**2
pl.scatter(X[:,0],X[:,1])
Out[107]:
In [108]:
y = transform(X)
In [109]:
y.shape
Out[109]:
In [110]:
pl.scatter(y[:,0],y[:,1])
Out[110]:
In [111]:
dim=2
evecs[:dim].shape
Out[111]:
In [112]:
cov = np.cov(X,rowvar=0)
evals,evecs = linalg.eig(cov)
W = evecs[:dim]
y = W.dot(X.T).T
In [124]:
X2 = W[:1].dot(y.T).T
In [125]:
pl.scatter(X2[::-1,0],-X2[::-1,1])
In [126]:
X2.shape
Out[126]:
In [127]:
pl.scatter(range(len(X2)),X2)
Out[127]:
In [ ]: