lijun255sysu的个人博客分享 http://blog.sciencenet.cn/u/lijun255sysu

博文

Python_机器学习_总结10:降维压缩数据---主成分分析法(PCA)

已有 393 次阅读 2018-9-10 19:38 |系统分类:科研笔记

  • 特征选取和特征选择的区别:

    • 特征选择:能够保持数据的原始特征;

    • 特征抽取:将数据转换或者映射到新的特征空间;即在尽可能保持相关信息的前提下,对数据进行压缩;


  •  减无监督数据降维技术:主成分分析法(PCA)

    • PCA是基于特征之间的关系,识别数据内在的本质;

    • PCA是在高位数据中找到最大方差的方向,同时将数据映射到 维度更小(与原始数据相比)的新的子空间;

    • 说明:转换到新空间后,

      • 第一主成分的方差应该是最大的;

      • 各主成分之间是不相关的(正交),后续各主成分也具备较大方差;

      • 主成分方向对数据值范围高度敏感,因此需要对特征进行标准化处理;

    • 算法基本流程如下:

      • 对原始d微数据集做标准化处理;

      • 构造样本的协方差矩阵;

      • 计算协方差矩阵的特征值和相应的特征向量;

      • 选择与前k个最大特征值相对于的特征向量,其中k为新特征空间维度;(k≤d)

      • 通过前k个特征向量构建映射矩阵w;

      • 通过映射矩阵w将d维数据集X转换到新的k为特征空间;

    

    • 协方差矩阵:

      •  两个特征之间的协方差为正,说明二者会同时增减;为负,说明二者异向;

      •  协方差矩阵的特征向量代表主成分(最大方差方向),其对应的特征值大小就表示特征向量的重要性;

      • 利用np.con()计算协方差矩阵;利用np.linalg.eig()求特征向量和特征值;

    • 特征值的方差贡献率(variance explained rations):

      • 贡献率是特征值和所有特征值之和的比值;

      • 利用Np.cumsum()计算累计方差贡献率;

    • 按照降序排列特征值和对应的特征向量


    • 程序执行结果如下:

image.pngimage.png


import pandas as pd
df_wine = pd.read_csv('http://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']
#将数据分成训练集和测试集
from sklearn.cross_validation import train_test_split
X, y = df_wine.iloc[:,1:].values, df_wine.iloc[:,0].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,random_state=0)
#标准化
from sklearn.preprocessing import StandardScaler
stdsc = StandardScaler()
X_train_std = stdsc.fit_transform(X_train)
X_test_std = stdsc.transform(X_test)
#计算特征值和特征向量
import numpy as np
cov_mat = np.cov(X_train_std.T)
eigen_vals, eigen_vecs = np.linalg.eig(cov_mat)
print('\n Eigenvalues \n %s' % eigen_vals)
#计算方差贡献率
tot = sum(eigen_vals)
var_exp = [(i/tot) for i in sorted(eigen_vals, reverse=True)]
cum_var_exp = np.cumsum(var_exp)
import matplotlib.pyplot as plt
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 ration')
plt.xlabel('Principal components')
plt.legend(loc='best')
plt.show()
#按照降序排列特征值和特征向量
eigen_pairs = [(np.abs(eigen_vals[i]), eigen_vecs[:,i]) for i in range(len(eigen_vals))]
eigen_pairs.sort(reverse=True)
w = np.hstack((eigen_pairs[0][1][:, np.newaxis], eigen_pairs[1][1][:,np.newaxis]))
print('Matrix W:"\n', w)
#映射数据到新空间
X_train_pca = X_train_std.dot(w)
#在新的空间中,显示数据
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.show()




使用scikit-learn进行主成分分析:利用LogisticRegression回归进行分类

image.png




import matplotlib.pyplot as plt
import pandas as pd
df_wine = pd.read_csv('http://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']
#将数据分成训练集和测试集
from sklearn.cross_validation import train_test_split
X, y = df_wine.iloc[:,1:].values, df_wine.iloc[:,0].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,random_state=0)
#标准化
from sklearn.preprocessing import StandardScaler
stdsc = StandardScaler()
X_train_std = stdsc.fit_transform(X_train)
X_test_std = stdsc.transform(X_test)

#
from plot_decision_regions import plot_decision_regions
from sklearn.linear_model import LogisticRegression
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
lr = LogisticRegression()
X_train_pca = pca.fit_transform(X_train_std)
X_test_pca = pca.transform(X_test_std)
lr.fit(X_train_pca, y_train)
plot_decision_regions(X_train_pca, y_train, classifier=lr)
plt.xlabel('PC 1')
plt.ylabel('PC 2')
plt.legend(loc='lower left')
plt.show()

#参考《Python 机器学习》,作者:Sebastian Raschaka, 机械工业出版社;



http://blog.sciencenet.cn/blog-3377553-1134006.html

上一篇:Python_机器学习_总结9:数据预处理(2)
下一篇:Python_机器学习_总结11:降维压缩数据---线性判别法(LDA)

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备14006957 )

GMT+8, 2018-9-24 07:51

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部