PCA聚类分析

利用PCA主成份分析可以将高维的数据降到低维,降维是对数据高维度特征的一种预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。

将物理或抽象对象的集合分组成为有类似的对象组成的多个子计划的过程叫聚类,聚类一般是对几个数据项同时操作。分类的学习过程是一种有指导的学习过程,是基于某种标量,进行分类,而聚类的学习过程是一种无指导的学习过程。

1.基本算法理论

PCA做的事情就是找到这样一组基向量来表示已有的数据点,不仅仅是将高维度数据变成低维度数据,更能够找到最关键信息。将上节说的找到最大的方差这种表述,用数学符号表示,假设已有数据{xi},i=1,2,...,n,希望能够找到一组基向量使得这些数据向量在基向量上的分量(长度,投影)最大。定义在基向量wi上投影分量大小为yi,可以得到

yi=wi⋅(xi−m)

其中m是数据点的中心,也就是说

m=1n∑i=1nxi

这样计算。

我们要解决这样的一个问题:对i=1,2,...,n,找到长度为1的基向量wi,使得yi的方差最大(即最好区分),形式化为

argmaxwiVar(yi),s.t.||wi||=1

其中Var(yi)按照

Var(yi)=E[(y−E(y)2]

计算E(⋅)表示数学期望。

可以得到解为

Cwi=λwi,||wi||=1

其中C是Z=(X−m)的协方差矩阵(covariance matrix),

C=E{(X−m)(X−m)T}

可以发现wi其实就是所要求的特征向量。于是我们的问题,就变成了,求Z的协方差矩阵C,然后求出C的特征向量,这些就是要找的基向量。下面将按步骤叙述PCA算法:

1.计算样本均值m;

2.计算协方差矩阵C;

3.求出C的特征向量及对应的特征值并归一化,特征值的大小对应该特征向量的重要性;(补充一下,按照定理,因为协方差矩阵式对称的,所以特征值一定是正的)

4.选前K个特征向量(按特征值大小排序),这就是我们要找的基向量;

5.将基向量作为矩阵的列构成一个新的矩阵V;

6.每个数据点的主成分cici(变换后的坐标)计算为:

ci=Vtzi

利用PCA降维将数据降到两个维度,方便数据可视化

接着使用K-means聚类

1.首先确定质心数(自己想要聚成几类)

K值是聚类结果中类别的数量。简单的说就是我们希望将数据划分的类别数。K值决定了初始质心的数量。K值为几,就要有几个质心。选择最优K值没有固定的公式或方法,需要人工来指定,建议根据实际的业务需求,或通过层次聚类(Hierarchical Clustering)的方法获得数据的类别数量作为选择K值的参考。这里需要注意的是选择较大的K值可以降低数据的误差,但会增加过拟合的风险。

2.计算距离并划分数据

计算距离的方法是使用欧式距离。以下是欧式距离的计算公式。距离值越小表示两个数据的相似度越高。

3.得到聚类数据

2.Python程序源码(利用Jupyter notebook)

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

%matplotlib inline # 导入数据分析模块

newf1 = open('./数据/寿阳结果/2017寿阳处理.csv')

new1 = pd.read_csv(newf1) # 打开文件,先令一个值等于文件,再利用pandas模块read_csv()直接打开文件(注意路径)

new1 # 查看数据




PCL OPTICS聚类算法 聚类分析pca_python k-means聚类分析


data1 = np.array(list(zip(new1['2017挠度均'],new1['2017裂缝均'],new1['2017温度均'],new1['2017湿度均'],new1['2017应力均']))) # 将四个维度的数据,利用zip函数和list函数转化成一个四维数组,方便PCA降维,聚类

data1 # 查看数据


PCL OPTICS聚类算法 聚类分析pca_matlab pca求曲率和法向量_02


from sklearn.cluster import KMeans

from sklearn.decomposition import PCA # 导入Kmeans 与PCA模块

kmeans = KMeans(n_clusters=3) # 设定初始质心数

pca = PCA(n_components=2) # 设定降维数

pca.fit(data1) # 训练数据

data1_pca = pca.transform(data1) # 进行PCA降维

data1_pca # 查看降维后数据


PCL OPTICS聚类算法 聚类分析pca_PCL OPTICS聚类算法_03


kmeans.fit(data1_pca) # 将降维后的数据进行聚类训练

y_ = kmeans.predict(data1_pca) # 预测聚类结果

plt.scatter(data1_pca[:,0],data1_pca[:,1],c = y_) # 将聚类结果可视化


PCL OPTICS聚类算法 聚类分析pca_matlab pca求曲率和法向量_04


a = kmeans.labels_.tolist() # 将聚类标签转化成列表

a # 查看数据

new1['标签'] = a # 原数据表新建‘标签’列,将数据赋值到标签列

new1 # 查看数据


PCL OPTICS聚类算法 聚类分析pca_数据_05


l0 = new1[new1['标签'].isin(['0'])]

l1 = new1[new1['标签'].isin(['1'])]

l2 = new1[new1['标签'].isin(['2'])] # 通过isin函数按标签值分别将所有数据取出

display(l0,l1,l2) # 查看数据


PCL OPTICS聚类算法 聚类分析pca_PCL OPTICS聚类算法_06


PCL OPTICS聚类算法 聚类分析pca_数据_07


PCL OPTICS聚类算法 聚类分析pca_PCL OPTICS聚类算法_08


l0.to_csv('2018标签0.csv')

l1.to_csv('2018标签1.csv')

l2.to_csv('2018标签2.csv') # 最后将结果输出为Excel表