Matlab机器学习:聚类问题
Clustering属于⽆监督学习问题。我拿到⼀堆数据,希望把这堆数据中有着类似性质的个体聚为⼀类。即,我们希望到数据中⾃然存在的分组。
例⼦:把球员分组
在⽆监督学习问题中,我们希望能够寻到数据中⾃然存在的模式或分组。⽐如我现在有⼀份篮球运动员的数据表,我该怎么样把球员进⾏分类呢?
⼈类知道⼀个球队成员分为Guards, Forwards, and Centers三类,但是机器并不知道。
相同位置的球员的统计数据是差不多的。也就是说⼀个完全不懂篮球的机器也可以通过分析统计数据对球员进⾏分类。聚类问题就是希望通过这些从各个维度来描述球员的信息中把他们聚成⼏类。
然后我们检查机器的分类是不是与我们传统的分类⼀致。
预估数据是否能够聚类:降维可视化
拿到球员数据后,我们应该先就对这组数据实施聚类操作的可⾏性进⾏预估。最简单的办法就是画出数据的图像,看看这些数据点是否有⼀簇⼀簇的⾃然分组。
对于像球员这样的数据,从很多个维度来描述⼀个个体,如上表中的⾝⾼、体重、得分、篮板等等。我们可以使⽤corr()函数和heatmap()函数看到各个维度之间的相关性。
但是这样的图远没有⼆维和三维图像来的直观,所以就有了维度下降算法。
什么是维数下降
但机器学习中的数据总是会有很多维度,使得可视化变得复杂且困难。
⽽数据是有⾃⼰的内部结构的,⽐如⼀个185cm的球员就不可能只有20kg的体重。 也就意味着⼤多数的信息其实是可以⽤少数⼏个维度来表⽰的。将原先的多维转化成低维空间并不会损失掉过多的信息。
这也就是使得我们将多维数据转为为低位数据,以便于清晰的可视化这些数据是否有被聚类的可能,提供了理论⽀撑。
两个⽅法:主成分分析(Principal Component Analysis,PCA), 多维缩放(Multi-dimensional Scaling,MDS)。让我们可以实现维度的降低。
多维放缩(Multi-dimensional Scaling)
在执⾏多维放缩之前需要先计算pairwise distance。数据点之间的关系存在于各个点的相对位置中,只要各点之间的距离没有变,即使数据点所⽣存空间的维度降低了,也不会损失掉过多的信息。
这⾥所说的距离可以有不同的形式,⽐如欧⽒距离,相关性等等。
load data
whos X
我有⼀个124*4的矩阵X,因此最好使⽤4维来表⽰。现在我希望通过MDS算法,使⽤更低的维度来可视化它,同时保留它所包含的⼤部分信息。
% 计算X 中各数据样本之间的Pairwise Distance
% 由于X 中有124个样本,故D 的长度为n (n -1)/2=7626
D = pdist (X )
% 出满⾜此Pairwise Distance 的维度最⼩的数据集Y
% e 是Y *Y'的特征值
[Y ,e ] = cmdscale (D )
% pareto 图按降序显⽰向量的相对⼤⼩
pareto (e )
这⾥涉及到特征值特征向量的概念,对这个名词没有概念的同学推荐阅读
感性的解释⼀下cmdscale()函数的含义。输⼊为Pairwise Distance,这是保证降维前后样本数据维持
基本不变的条件。输出有两个,⼀个是降维后的样本数据,⼀个是特征值向量,但是这个特征值并⾮降维后数据的特征值。
特征值向量是降序排列的,特征值⼤⼩的⽐例决定了降维后样本数据对应维度的重要程度。如:
从特征值的⼤⼩,以及pareto图的直观表⽰中可以看出,第1个特征值所占⽐重最⼤,所以输出Y中第1个维度的信息最重要。第4个特征值占⽐可以忽略不计,所以输出Y中的第4个维度⼏乎不包含什么信息。这也就表明将原始的4维样本数据降维到3维是合理的。
此外之后的特征值都是0,也就是说,再对这组数据样本增加维度并没有什么意义。就好⽐本可以⽤⼆维图像表⽰的⼀条直线,⾮要放到三维空间中去操作,只是⽩⽩给⾃⼰添堵。
% 画出了降维到2维,和降维到3维的样本数据
scatter (Y (:,1),Y (:,2))
scatter3(Y (:,1),Y (:,2),Y (:,3
))
主成分分析(Principal Component Analysis)
⼀般来说,欲获得低维⼦空间,最简单的是对原始⾼维空间进⾏线性变换。低维空间的每个维度是原来⾼维空间的线性组合。这种降维⽅法被称为线性降维⽅法,他们都符合下⾯这个形式:
当你对降维后的空间有不同的要求时,相当于对W施加了不同的约束条件。
load data
whos X
[pcs ,scrs ,~,~,pexp ] = pca (X );
pareto (pexp )
scatter (scrs (:,1),scrs (:,2))
从Pareto图表中可以看到90%以上的数据是由前两个主要成分解释的。
聚类算法:原型聚类
聚类算法可以分为原型聚类、密度聚类、层次聚类等等⼆级分类。原型聚类是⼀种极为常见的聚类算法,“原型”是指样本空间中具有代表性的点。此类算法假设聚类结构可以通过⼀组原型刻画出来。
通常算法先对原型进⾏初始化,然后对原型进⾏迭代更新求解。采⽤不同的原型表⽰、不同的求解⽅式,将常数不同的算法。下⾯介绍⼏种著名的原型聚类算法。
k-means Clustering
你可能预先知道要把数据分成多少组,可视化数据也会帮助您识别组的数量。在决定了要形成的组的数量之后,可以使⽤k-means聚类⽅法将观测数据划分到不同的簇中。
Z =W X
T
k-means算法的聚类原理是在数据中随机选k个数据作为中⼼,将其他的数据按最⼩距离归类到这k个中⼼所代表的簇中。
现在得到了三簇数据,。对簇数据的观测值取平均,得到新的中⼼,其余簇也⼀样。
然后对新的中⼼再执⾏重复的聚类算法。
由于k-means算法使⽤随机的初始中⼼点,所以聚类可能会出现问题。MATLAB会尝试很多初始中⼼点,将簇中数据距离中⼼的距离最近
作为最优的标准。
load data
matlab学好了有什么用whos X
% 使⽤k -means 算法对数据分组,分组标签存在grp
grp = kmeans (X ,3)
% ⽤不同的颜⾊观察分组数据
scatter (X (:,1),X (:,2),10,grp
)
Gaussian Mixture Model
另⼀种可以使⽤的聚类⽅法是⾼斯混合模型(Gaussian Mixture Models, GMM)。
GMM聚类涉及到对数据拟合⼏个n维正态分布,并使⽤这些分布将每个观测分配到⼀个聚类。
% 代码1
load data
whos X
mdl = fitgmdist (X ,3,"CovarianceType","diagonal");
grp = cluster (mdl ,X );
scatter (X (:,1),X (:,2),10,grp
)
% 代码2
%Instructions are in the task pane to the left . Complete and submit each task one at a time .
This code loads and formats the data .
data = readtable ("");
data .pos = categorical (data .pos );
% This code extracts and normalizes the columns of interest .
stats = data {:,[5 6 11:end ]};
statsNorm = normalize (stats );
gmModel = fitgmdist (statsNorm ,2,"Replicates",5,"RegularizationValue",0.02);
[grp ,~,gprob ] = cluster (gmModel ,statsNorm );
% This code performs PCA and plots the transformed data by group .
[pcs ,scrs ] = pca (statsNorm );
scatter3(scrs (:,1),scrs (:,2),scrs (:,3),10,grp )
view (110,40)
% This code visualizes group separation .
gpsort = sortrows (gprob ,1);
plot (gpsort )
xlabel ("Point Ranking")
ylabel ("Cluster Membership Probability")
legend ("Cluster 1","Cluster 2"
)
评估聚类的效果
假设我将篮球运动员分成了两个组。我需要识别出有助于形成集的统计信息。
本节就是解释集和评估集质量的⼀些⽅法。
平⾏坐标
k ,k ,k 123k 1
%有124个4维观测值
load data
whos X
%使⽤k-means算法对数据X聚类,并返回其3个聚类中⼼
[grp,C]=kmeans(X,3);
%从数据的平⾏坐标图中⾄少可以看出,Cluster1的第⼆维度是⾼的
parallelcoords(X,"Group",grp)
%画⼀下三个聚类中⼼的平⾏坐标系
parallelcoords(C,"Group",1:3)
parallelcoords(X,"Group",grp,"Quantile",0.25)
交叉表
在⼀些数据集中,观测数据已经有了⼀个与之相关的类别。可以使⽤crosstab()函数研究集在原始类别中的分布情况
load data2
whos X yCat
grp =kmeans(X,2);
scatter(X(:,1),X(:,2),15,grp)
cts =crosstab(yCat,grp)
bar(cts,"stacked")
xticklabels(categories(yCat))
legend(string(1:2))
bar(cts',"stacked")
legend(categories(yCat))
剪影值
在使⽤k-means和⾼斯混合模型等聚类技术时,必须指定聚类的数量。然⽽,对于⾼维数据,很难确定最优的聚类数量。
可以使⽤剪影(silhouette/ˌsɪluˈet/)值来判断聚类的质量如何。⼀个观测数据的剪影值反应了它相对于其他簇的数据⽽⾔,与⾃⼰簇中数据的距离有多近。
剪影图显⽰每个观测的剪影值,按聚类进⾏分组。在聚类⽅案中,⼤多数观测具有较⾼的剪影值是可取的。
如下图:
左图中负剪影值较少,且幅度较⼩,所以这种聚类效果⽐较好。
此外使⽤evalclusters()函数来⾃动化评估聚类质量。
聚类算法:层次聚类
层次聚类(hierarchical clustering)使⽤不同的层次对数据集进⾏聚类,从⽽形成树状的聚类结构。数据集的划分可采⽤“⾃底向上”的聚合策略,也可采⽤“⾃顶向下”的分拆策略。以“⾃底向上”举例。
⾸先将每⼀个样本看作⼀个簇,然后将两个聚类最近簇进⾏合并。不断重复该过程,直到成为⼀个簇。
关键是如何计算聚类簇之间的距离。最⼩距离由两簇最近的样本决定,最⼤距离由两簇最远的样本决定,平均距离由两簇所有样本决定。创建层次树
load data
whos X
Z =linkage(X);
dendrogram(Z)
Zcomp =linkage(X,"ward");
dendrogram(Zcomp)
将层次树分解为聚类簇
load data
whos X
Z =linkage(X);
dendrogram(Z)
grp =cluster(Z,"maxclust",3);
parallelcoords(X,"Group",grp)
% Cophenetic correlation系数量化了层次树代表观测值之间距离的准确性
%值越接近于1,代表知量越⾼
%计算X的pairwise distance,然后与Y相⽐较
Y =pdist(X);
c =cophenet(Z,Y)
总结项⽬:⼩麦种⼦
我有⼀组⼩麦种⼦的数据(210*8),包含它的7种参数以及类别,共8列数据。
data =readtable("")
numData = data{:,1:end-1};
variety = data.variety;
分别使⽤上述的三种聚类⽅法对⼩麦数据进⾏聚类。
grpK =kmeans(numData,3);
gmModel =fitgmdist(numData,3);
grpGMM =cluster(gmModel,numData);
Z =linkage(numData);
grpTree =cluster(Z,"maxclust",3);
%画出聚类图,以及它与真实分类之间的差距图
%函数定义在⽂后给出
plotClusters(numData,grpK,grpGMM,grpTree)
plotCrosstabs(variety,grpK,grpGMM,grpTree)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论