学习《python machine learning》chapter5——Compressing data via dimensionality reduction
主要内容如下:
(1)主要成分分析 Principal Component Analysis (PCA) ——非监督学习
(2)线性判别分析 Linear Discriminant Analysis (LDA) ——监督学习
(3)核主成分分析 Kernel Principal Component Analysis ——非线性降维
源码 git 地址:https://github.com/xuman-Amy/compressing-data
【PCA】
主要思想:在高维数据集中找到变化最大的方向,并把它投射到一个同等维度或者更低维度的子空间上。
主要方法:创建一个维的转换矩阵
,通过转换矩阵将样本向量 x 从 原本的d 维特征子空间转换到 k 维特征子空间。
()。
通过转换矩阵后,新特征是旧特征的线性组合,新特征线性无关,最终的新特征子集相互正交。
主要步骤:
(1) 标准化d维数据集(Standardize)
(2)创建协方差矩阵(covariance matrix)
(3)将协方差矩阵分解为特征向量和特征值(eigenvectors and eigenvalues)
(4)通过降序排列特征值从而实现对相应的特征向量进行排序。
(5)选择K个特征向量,这K个特征向量对应K个最大的特征值。(K即特征新子集的维度)
(6)选择top K个特征向量创建投影矩阵W
(7)通过投影矩阵W对d维输入数据集进行转换,得到k维特征子空间。
【通过python逐步进行PCA】
【准备数据】
#import data
#import dataimport pandas as pd
df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/'
'machine-learning-databases/wine/wine.data',
header=None)
df_wine.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash',
'Alcalinity of ash', 'Magnesium', 'Total phenols',
'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins',
'Color intensity', 'Hue',
'OD280/OD315 of diluted wines', 'Proline']
df_wine.head()
【切分数据 train and test】
#seperate data into train and test
from sklearn.model_selection import train_test_split
X, y =df_wine.iloc[:,1:],df_wine.iloc[:,0]
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size = 0.3,
random_state = 0,
stratify = y)
1、【标准化】
#Standardize the features
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train_std = sc.fit_transform(X_train)
X_test_std = sc.transform(X_test)
2、【创建协方差矩阵】
协方差计算公式
其中,
分别为均值。
协方差矩阵
计算协方差矩阵numpy.cov()
#construct covariance
import numpy as np
#cov()函数,如果只有一个参数,那么这个参数的每一行代表特征值,每一列代表一个样本。
#所以运用cov计算协方差矩阵时,要先对矩阵进行转置
cov_mat = np.cov(X_train_std.T)
3、【分解为特征对】
利用np.linalg.eig()函数直接得到特征对。
eigen_vals, eigrn_vecs = np.linalg.eig(cov_mat)
print('Eigenvalues \n %s' % eigen_vals)
【total and explained variances】
numpy.cumsum 计算累计和
看一下方差累积图
import matplotlib.pyplot as plt
total = sum(eigen_vals)
var_exp = [(i / total ) for i in sorted(eigen_vals, reverse = True)]
cum_var_exp = np.cumsum(var_exp)
plt.bar(range(1, 14), var_exp, alpha=0.5, align='center',
label='individual explained variance')
plt.step(range(1, 14), cum_var_exp, where='mid',
label='cumulative explained variance')
plt.ylabel('Explained variance ratio')
plt.xlabel('Principal component index')
plt.legend(loc='best')
plt.tight_layout()
# plt.savefig('images/05_02.png', dpi=300)
plt.show()
4、【降序排列特征值实现特征向量的排序】
# Make a list of (eigenvalue, eigenvector) tuples
eigen_pairs = [(np.abs(eigen_vals[i]),eigen_vecs[:,i]) for i in range(len(eigen_vals))]
#Sort the (eigenvalue, eigenvector) tuples from high to low
#lambda k :k[0] 函数 表示取k的第0 个元素,即取eigen_pairs[0],按照特征值大小排序
eigen_pairs.sort(key = lambda k : k[0], reverse = True)
5、【选择k个特征向量对应top k 最大特征值】
6、【创建投影矩阵w】
#choose the two largest eigenvalues
#np.newaxis 创建新的坐标轴,返回列向量
w = np.hstack((eigen_pairs[0][1][:, np.newaxis],
eigen_pairs[1][1][:, np.newaxis]))
print('Matrix W:\n', w)
7、【利用W进行矩阵转换】
x为1*13的矩阵,w为13*2的矩阵,x'wei 1*2的矩阵即x'是一个含有两个特征值的二维向量。
X_train_std[0].dot(w)
将整个数据集124*13进行矩阵转换,得到含有两个特征值的124*2的向量。即实现主要成分分析PCA。
X_train_pca = X_train_std.dot(w)
X_train_pca
【查看X_train_pca 】
#visualize the transformed Wine dataset
colors = ['r', 'b', 'g']
markers = ['s', 'x', 'o']
for l, c, m in zip(np.unique(y_train), colors, markers):
plt.scatter(X_train_pca[y_train == l, 0],
X_train_pca[y_train == l, 1],
c=c, label=l, marker=m)
plt.xlabel('PC 1')
plt.ylabel('PC 2')
plt.legend(loc='lower left')
plt.tight_layout()
# plt.savefig('images/05_03.png', dpi=300)
plt.show()
【sklearn 实现PCA】
从sklearn.decomposition 库中import PCA
#sklearn实现PCA
# LogisticRegression 实现分类
from sklearn.linear_model import LogisticRegression
from sklearn.decomposition import PCA
pca = PCA(n_components = 2)
X_train_pca = pca.fit_transform(X_train_std)
X_test_pca = pca.transform(X_test_std)
lr = LogisticRegression()
lr.fit(X_train_pca,y_train)
plot_decision_regions(X = X_train_pca, y = y_train, classifier = lr)
plt.xlabel('PC 1')
plt.ylabel('PC 2')
plt.legend(loc = 'lower left')
plt.show()
看一下对于X_test的分类
#查看对X_test的分类
plot_decision_regions(X_test_pca, y_test, classifier=lr)
plt.xlabel('PC 1')
plt.ylabel('PC 2')
plt.legend(loc='lower left')
plt.tight_layout()
plt.show()
看起来对于两个特征值的分类还不错