机器学习——主成分分析(PCA)

#先随便创建一个具有相关性的数据集
import numpy as np
from matplotlib import pyplot as plt
from numpy import linalg

np.random.seed(2)
#构造数据集
x1=[i for i in np.arange(1,10,0.1)]
x2=[np.random.uniform(2,4)*i+np.random.randn() for i in x1]
plt.scatter(x1,x2)

#zeros创建一个符合shape的随机矩阵,其实不是全0矩阵,也可能是一些随机的数字
#将数据集转化成矩阵形式
x=np.zeros((90,2))
x[:,0]=np.array(x1)
x[:,1]=np.array(x2)
x.shape

#(90, 2)


机器学习——主成分分析(PCA)_第1张图片
第一步中心化

#axis参数是选择计算行方向的均值还是列方向的均值
data_array=x
mean_array=np.mean(data_array,axis=0)
center_array=data_array-mean_array


#或者用subtract
center_array=np.subtract(data_array,np.mean(data_array,axis=0) )

第二步计算协方差矩阵和特征值、特征向量

#rowvar参数是选择行为一个样本还是列为样本
cov_array=np.cov(center_array,rowvar=False)

eig_vals, eig_vects = linalg.eig(cov_array)

"""
#特征值
(array([ 1.23589914, 80.95385223]),

#特征向量
 array([[-0.96430755, -0.26478471],
        [ 0.26478471, -0.96430755]]))

其中特征值 1.23589914对应的特征向量是array([-0.96430755,0.26478471])


"""
#这里应该选取前K个最大的特征值也就是主成分
#方便理解算法这里选取了所有特征值
#获取特征值排序的索引
val_index=np.argsort(eig_vals)
#逆序
val_index=val_index[::-1]
#选取对应的特征向量
eig_vect=eig_vects [:,val_index]
#这里选取第一个主成分矩阵
np.dot(center_array, eig_vect)[:,0]

机器学习——主成分分析(PCA)_第2张图片
调用sklearn模块进行验证

from sklearn.decomposition import PCA
data_mat = x
pca = PCA(n_components=1)
pca.fit(data_mat)
x_p=pca.fit(data_mat).transform(data_mat)
x_p

#结果是一致的

你可能感兴趣的:(机器学习,机器学习,python)