python降维将多列数据压缩为一列_科学网—Python_机器学习_总结10:降维压缩数据---主成分分析法(PCA) - 李军的博文...

特征选取和特征选择的区别:特征选择:能够保持数据的原始特征;

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

减无监督数据降维技术:主成分分析法(PCA)PCA是基于特征之间的关系,识别数据内在的本质;

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

说明:转换到新空间后,第一主成分的方差应该是最大的;

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

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

算法基本流程如下:对原始d微数据集做标准化处理;

构造样本的协方差矩阵;

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

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

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

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

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

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

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

特征值的方差贡献率(variance explained rations):贡献率是特征值和所有特征值之和的比值;

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

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

程序执行结果如下:

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回归进行分类

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值