import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from numpy import *
x = random.normal(5,.5,1000)
y = random.normal(3,1,1000)
z=random.normal(0,1,1000)
a = x*cos(pi/4) + y*sin(pi/4)
b = -x*sin(pi/4) + y*cos(pi/4)
c =- z*sin(pi/4) + -y*cos(pi/4)
k=1
data=zeros((1000,3))
data[:,0]=a
data[:,1]=b
data[:,2]=c
m=mean(data,axis=0)
s=std(data,axis=0)
data=(data-m)/s
c=cov(transpose(data))
eigvalues,eigvectors=linalg.eig(c)
indexes=argsort(eigvalues)
indexes=indexes[::-1]
eigvectors=eigvectors[:,indexes]
eigvalues=eigvalues[indexes]
eigvectors=eigvectors[:,:k]
print(sum(eigvalues[:k])/sum(eigvalues))
x=dot(transpose(eigvectors),transpose(data))
y=(transpose(dot(eigvectors,x))+m)*s
fig=plt.figure()
ax=fig.add_subplot(111,projection='3d')
ax.scatter(y[:,0],y[:,1],y[:,2],c='b',marker='o')
ax.set_xlabel('X_label')
ax.set_ylabel('Y_label')
ax.set_zlabel('Z_label')
plt.show()
代码演示,如上。包括数据生成的方法。