跟我学算法-pca(降维)
2021-07-17 13:05
标签:表达 att pair 重要 plt stack 需要 方差 air pca是一种黑箱子式的降维方式,通过映射,希望投影后的数据尽可能的分散, 因此要保证映射后的方差尽可能大,下一个映射的方向与当前映射方向正交 pca的步骤: 第一步: 首先要对当前数据(去均值)求协方差矩阵,协方差矩阵= 数据*数据的转置/(m-1) m表示的列数,对角线上表示的是方差,其他位置表示的是协方差 第二步:需要通过矩阵对角化,使得协方差为0,只存在对角线方向的数据,这个时候就能得到我们的特征值和特征向量 第三步: 将当前数据*特征向量就完成了降维工作,特征值/特征值之和, 可以表示特征值对应特征向量的表达重要性 下面是程序的说明 第一步:数据导入, 去均值, 求协方差 第二步:求矩阵对角化的过程,就是一个求特征值和特征向量的过程 第三步:将数据(去均值) 跟我学算法-pca(降维) 标签:表达 att pair 重要 plt stack 需要 方差 air 原文地址:https://www.cnblogs.com/my-love-is-python/p/9532249.htmlimport pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.data‘)
print(df.head())
df.columns=[‘sepal_len‘, ‘sepal_wid‘, ‘petal_len‘, ‘petal_wid‘, ‘class‘]
print(df.head())
# 用来储存变量
X = df.ix[:, 0:4].values
#用来储存标签
y = df.ix[:, 4].values
msg ={‘Iris-setosa‘:0, ‘Iris-versicolor‘:1, ‘Iris-virginica‘:2}
df[‘class‘] = df[‘class‘].map(msg) #把字母换成数字
#进行标准化
from sklearn.preprocessing import StandardScaler
Scaler = StandardScaler()
X_Scaler = Scaler.fit_transform(X)
# 求每一行的均值
mean_vec = np.mean(X_Scaler, axis=0)
#去均值后求协方差矩阵
cov_mat = (X_Scaler-mean_vec).T.dot(X_Scaler-mean_vec)/(X_Scaler.shape[0]-1)
print(cov_mat)
#使用np求协方差矩阵,结果是一样的
cov_mat = np.cov(X_Scaler.T)
print(cov_mat)
# 求特征值和特征向量
eig_vals, eig_vecs = np.linalg.eig(cov_mat)
print(eig_vals, eig_vecs)
#将特征值与特征向量合并
eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:, i]) for i in range(len(eig_vals))] #组合对应
eig_pairs.sort(key=lambda x:x[0], reverse=True)
tot = sum(eig_vals)
var_exp = [(i/tot)*100 for i in sorted(eig_vals, reverse=True)]
#cumsum表示每前两个数相加
cum_var_exp = np.cumsum(var_exp)
#画图
plt.figure(figsize=(6, 4))
#画柱状图
plt.bar(range(4), var_exp, alpha=0.5, align=‘center‘,
label=‘individual explained variance‘)
#画步阶图
plt.step(range(4), cum_var_exp, where=‘mid‘,
label=‘cumulative explained variance‘)
plt.ylabel(‘Explained variance ratio‘)
plt.xlabel(‘Principal components‘)
plt.legend(loc=‘best‘)
plt.tight_layout()
#把4维矩阵降低到两维,取前两个特征向量组合转置点乘即可
#np.hstack合并两个向量,reshape让一行变成一列,相当于转置
matrix_w = np.hstack((eig_pairs[0][1].reshape(4,1),
eig_pairs[1][1].reshape(4,1)))
#变换以后的矩阵149*4 .dot 4*2 = 149*2
become_X_Scaler = X_Scaler.dot(matrix_w)
print(become_X_Scaler)
plt.figure(figsize=(6, 4))
color = np.array([‘red‘, ‘green‘, ‘blue‘]) #构成行列式
plt.scatter(become_X_Scaler[:,0], become_X_Scaler[:,1], c=color[df[‘class‘]]) #画出种类对应颜色的散点图
plt.show()
上一篇:python实现单链表翻转
下一篇:Python(random库)