python pca降维数据的保存,PCA数据降维原理及python应用(葡萄酒案例分析)

目录

主成分分析(PCA)——以葡萄酒数据集分类为例

1、认识PCA

(1)简介

数据降维的一种方法是通过特征提取实现,主成分分析PCA就是一种无监督数据压缩技术,广泛应用于特征提取和降维。

换言之,PCA技术就是在高维数据中寻找最大方差的方向,将这个方向投影到维度更小的新子空间。例如,将原数据向量x,通过构建

12aac4fefbddac0d7bb1ca48c0af6745.gif

维变换矩阵 W,映射到新的k维子空间,通常(

5be58a686d60226215fff7be83b07186.gif

)。

原数据d维向量空间

a2ac41b97fced329220202bc09f3e24d.gif

经过

68e2c1eb4a9bbae61259c079ad8dd4c1.gif

,得到新的k维向量空间

124cf35f55dde5d7da6437ba7e1e3c2f.gif

.

第一主成分有最大的方差,在PCA之前需要对特征进行标准化,保证所有特征在相同尺度下均衡。

(2)方法步骤

标准化d维数据集。

构建协方差矩阵。

将协方差矩阵分解为特征向量和特征值。

对特征值进行降序排列,相应的特征向量作为整体降序。

选择k个最大特征值的特征向量,

5be58a686d60226215fff7be83b07186.gif

根据提取的k个特征向量构造投影矩阵

8cf8fffa4db58a3f254b11987ca9cecf.gif

d维数据经过

8cf8fffa4db58a3f254b11987ca9cecf.gif

变换获得k维。

下面使用python逐步完成葡萄酒的PCA案例。

2、提取主成分

下载葡萄酒数据集

wine.data

到本地,或者到时在加载数据代码是从远程服务器获取,为了避免加载超时推荐下载本地数据集。

来看看数据集长什么样子!一共有3类,标签为1,2,3 。每一行为一组数据,由13个维度的值表示,我们将它看成一个向量。

开始加载数据集。

import pandas as pd

import numpy as np

from sklearn.preprocessing import StandardScaler

from sklearn.model_selection import train_test_split

import matplotlib.pyplot as plt

# load data

df_wine = pd.read_csv('D:\\PyCharm_Project\\maching_learning\\wine_data\\wine.data', header=None) # 本地加载,路径为本地数据集存放位置

# df_wine=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data',header=None)#服务器加载

下一步将数据按7:3划分为training-data和testing-data,并进行标准化处理。

# split the data,train:test=7:3

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, stratify=y, random_state=0)

# standardize the feature 标准化

sc = StandardScaler()

x_train_std = sc.fit_transform(x_train)

x_test_std = sc.fit_transform(x_test)

这个过程可以自行打印出数据进行观察研究。

接下来构造协方差矩阵。

7b376c47f3292cc085dcc117194a3979.gif

维协方差对称矩阵,实际操作就是计算不同特征列之间的协方差。公式如下:

7121aaa8a64b9de8a3e21397831cffa9.gif

公式中,jk就是在矩阵中的行列下标,i表示第i行数据,

ed856439ab499977dfca6dc5d5ab7656.gif

分别为特征列 j,k的均值。最后得到的协方差矩阵是13*13,这里以3*3为例,如下:

b5c4debf852d3a082e61e8c020c17a3b.gif

下面使用numpy实现计算协方差并提取特征值和特征向量。

# 构造协方差矩阵,得到特征向量和特征值

cov_matrix = np.cov(x_train_std.T)

eigen_val, eigen_vec = np.linalg.eig(cov_matrix)

# print("values\n ", eigen_val, "\nvector\n ", eigen_vec)# 可以打印看看

python pca降维数据的保存,PCA数据降维原理及python应用(葡萄酒案例分析)_第1张图片

3、主成分方差可视化

首先,计算主成分方差比率,每个特征值方差与特征值方差总和之比:

c9892526bb93ff0fe6f5e278109ff37c.gif

代码实现:

# 解释方差比

tot = sum(eigen_val) # 总特征值和

var_exp = [(i / tot) for i in sorted(eigen_val, reverse=True)] # 计算解释方差比,降序

# print(var_exp)

cum_var_exp = np.cumsum(var_exp) # 累加方差比率

plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文

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("解释方差率")

plt.xlabel("主成分索引")

plt.legend(loc='right')

plt.show()

可视化结果看出,第一二主成分占据大部分方差,接近60%。

python pca降维数据的保存,PCA数据降维原理及python应用(葡萄酒案例分析)_第2张图片

各主成分占比

4、特征变换

这一步需要构造之前讲到的投影矩阵

8cf8fffa4db58a3f254b11987ca9cecf.gif

,从高维d变换到低维空间k。

先将提取的特征对进行降序排列:

# 特征变换

eigen_pairs = [(np.abs(eigen_val[i]), eigen_vec[:, i]) for i in range(len(eigen_val))]

eigen_pairs.sort(key=lambda k: k[0], reverse=True) # (特征值,特征向量)降序排列

从上步骤可视化,选取第一二主成分作为最大特征向量进行构造投影矩阵。

w = np.hstack((eigen_pairs[0][1][:, np.newaxis], eigen_pairs[1][1][:, np.newaxis])) # 降维投影矩阵W

13*2维矩阵如下:

python pca降维数据的保存,PCA数据降维原理及python应用(葡萄酒案例分析)_第3张图片

这时,将原数据矩阵与投影矩阵相乘,转化为只有两个最大的特征主成分。

x_train_pca = x_train_std.dot(w)

5、数据分类结果

使用 matplotlib进行画图可视化,可见得,数据分布更多在x轴方向(第一主成分),这与之前方差占比解释一致,这时可以很直观区别3种不同类别。

代码实现:

color = ['r', 'g', 'b']

marker = ['s', 'x', 'o']

for l, c, m in zip(np.unique(y_train), color, marker):

plt.scatter(x_train_pca[y_train == l, 0],

x_train_pca[y_train == l, 1],

c=c, label=l, marker=m)

plt.title('Result')

plt.xlabel('PC1')

plt.ylabel('PC2')

plt.legend(loc='lower left')

plt.show()

python pca降维数据的保存,PCA数据降维原理及python应用(葡萄酒案例分析)_第4张图片

本案例介绍PCA单个步骤和实现过程,一点很重要,PCA是无监督学习技术,它的分类没有使用到样本标签,上面之所以看出3类不同标签,是后来画图时候自行添加的类别区分标签。

6、完整代码

import pandas as pd

import numpy as np

from sklearn.preprocessing import StandardScaler

from sklearn.model_selection import train_test_split

import matplotlib.pyplot as plt

def main():

# load data

df_wine = pd.read_csv('D:\\PyCharm_Project\\maching_learning\\wine_data\\wine.data', header=None) # 本地加载

# df_wine=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data',header=None)#服务器加载

# split the data,train:test=7:3

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, stratify=y, random_state=0)

# standardize the feature 标准化单位方差

sc = StandardScaler()

x_train_std = sc.fit_transform(x_train)

x_test_std = sc.fit_transform(x_test)

# print(x_train_std)

# 构造协方差矩阵,得到特征向量和特征值

cov_matrix = np.cov(x_train_std.T)

eigen_val, eigen_vec = np.linalg.eig(cov_matrix)

# print("values\n ", eigen_val, "\nvector\n ", eigen_vec)

# 解释方差比

tot = sum(eigen_val) # 总特征值和

var_exp = [(i / tot) for i in sorted(eigen_val, reverse=True)] # 计算解释方差比,降序

# print(var_exp)

# cum_var_exp = np.cumsum(var_exp) # 累加方差比率

# plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文

# 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("解释方差率")

# plt.xlabel("主成分索引")

# plt.legend(loc='right')

# plt.show()

# 特征变换

eigen_pairs = [(np.abs(eigen_val[i]), eigen_vec[:, i]) for i in range(len(eigen_val))]

eigen_pairs.sort(key=lambda k: k[0], reverse=True) # (特征值,特征向量)降序排列

# print(eigen_pairs)

w = np.hstack((eigen_pairs[0][1][:, np.newaxis], eigen_pairs[1][1][:, np.newaxis])) # 降维投影矩阵W

# print(w)

x_train_pca = x_train_std.dot(w)

# print(x_train_pca)

color = ['r', 'g', 'b']

marker = ['s', 'x', 'o']

for l, c, m in zip(np.unique(y_train), color, marker):

plt.scatter(x_train_pca[y_train == l, 0],

x_train_pca[y_train == l, 1],

c=c, label=l, marker=m)

plt.title('Result')

plt.xlabel('PC1')

plt.ylabel('PC2')

plt.legend(loc='lower left')

plt.show()

if __name__ == '__main__':

main()

总结:

本案例介绍PCA步骤和实现过程,单步进行是我更理解PCA内部实行的过程,主成分分析PCA作为一种无监督数据压缩技术,学习之后更好掌握数据特征提取和降维的实现方法。记录学习过程,不仅能让自己更好的理解知识,而且能与大家共勉,希望我们都能有所帮助!

你可能感兴趣的:(python,pca降维数据的保存)