从二维降到一维:
主成分分析(PCA)就是在尽可能保留数据特征的情况下,降低数据的维度。在sklearn.decomposition.PCA中,使用的是SVD(奇异值分解)的方法进行降维。
首先定义平面上四个点的坐标:
x = [[2,0], [2,2], [6,1], [0,0]]
from sklearn.decomposition import PCA
将n_components参数设为2,只旋转不降维来观测坐标轴的旋转变化。再将n_components的参数设为1后观测坐标轴减少变化。
从三维降到二维:
用datasets模块的Make_blobs()函数在三维空间产生五个簇,1000个样本:
make_blobs(n_samples=10000, n_features=3, centers=[[0,0,0], [1,1,0.5], [3,3,3], [2,5,2],[2.5,1,2]],cluster_std=[0.1, 0.2, 0.15, 0.17, 0.23])
再画出样本的三维投影:
fig = plt.figure()
ax = Axes3D(fig)
最后画出样本在各个面上的投影。利用PCA指定主成分其他用法输出维度投影方差占比分布同时输出降维后的特征数。
主要代码
二维降一维:
x = [[2,0], [2,2], [6,1], [0,0]] # 平面上四个点的坐标202182130016
from sklearn.decomposition import PCA
pca = PCA(n_components=2) # 只旋转不降维
pca.fit(x)
print("新的轴向量:")
print(pca.components_)
print("各维度投影方差占比分布:")
print(pca.explained_variance_ratio_)
print("各点在新轴上的投影:")
print(pca.transform(x))
pca = PCA(n_components=1) # 降到一维
pca.fit(x)
print("新的轴向量:")
print(pca.components_)
print("各维度投影方差占比分布:")
print(pca.explained_variance_ratio_)
print("各点在新轴上的投影:")
print(pca.transform(x))
三维降二维:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.datasets import make_blobs
X, _ = make_blobs(n_samples=10000, n_features=3, centers=[[0,0,0], [1,1,0.5], [3,3,3], [2,5,2],[2.5,1,2]],cluster_std=[0.1, 0.2, 0.15, 0.17, 0.23])
fig = plt.figure()
ax = Axes3D(fig)
plt.scatter(X[:, 0], X[:, 1], X[:, 2], marker='+')
plt.show()
plt.axes(aspect='equal')
plt.scatter(X[:, 0], X[:, 1], marker='+')
plt.show()
plt.axes(aspect='equal')
plt.scatter(X[:, 0], X[:, 2], marker='+')
plt.show()
plt.axes(aspect='equal')
plt.scatter(X[:, 1], X[:, 2], marker='+')
plt.show()
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(X)
print(pca.explained_variance_ratio_)
X_new = pca.transform(X)
plt.axes(aspect='equal')
plt.scatter(X_new[:, 0], X_new[:, 1], marker='+')
plt.show()
pca = PCA(n_components=0.9)
pca.fit(X)
print(pca.explained_variance_ratio_)
print("降维后的特征数:" + str(pca.n_components_))
pca = PCA(n_components=0.99)
pca.fit(X)
print(pca.explained_variance_ratio_)
print("降维后的特征数:" + str(pca.n_components_))