数据压缩之降维(一)——PCA降维

学习《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】

主要思想:在高维数据集中找到变化最大的方向,并把它投射到一个同等维度或者更低维度的子空间上。

数据压缩之降维(一)——PCA降维_第1张图片

主要方法:创建一个维的转换矩阵,通过转换矩阵将样本向量 x 从 原本的d 维特征子空间转换到 k 维特征子空间。

)。

通过转换矩阵后,新特征是旧特征的线性组合,新特征线性无关,最终的新特征子集相互正交。

数据压缩之降维(一)——PCA降维_第2张图片

主要步骤:

(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、【创建协方差矩阵】

协方差计算公式

其中,  分别为均值。

协方差矩阵

数据压缩之降维(一)——PCA降维_第3张图片

其中为大写希腊字母

计算协方差矩阵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 计算累计和

数据压缩之降维(一)——PCA降维_第4张图片

看一下方差累积图

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()

 

数据压缩之降维(一)——PCA降维_第5张图片

 

 

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)

 

 

 

数据压缩之降维(一)——PCA降维_第6张图片

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()

数据压缩之降维(一)——PCA降维_第7张图片

 

【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()

数据压缩之降维(一)——PCA降维_第8张图片

看一下对于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()

数据压缩之降维(一)——PCA降维_第9张图片

看起来对于两个特征值的分类还不错

 

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