零、写在前面
所谓聚类,就是将样本划分为由类似的对象组成的多个类的过程。聚类后,我们可以更加准确的在每个类中单独使用统计模型进行估计、分析和预测;也可以探究不同类之间的相关性和主要差异。
聚类模型中,有一个名词叫簇频繁出现,可以理解为类,一簇就是一类。
聚类一般对对象分类,也可以对指标分类。
一、分类
1.1辨析
聚类和分类的区别:分类是已知类别的,聚类未知。
二、模型/算法
2.1K-means聚类算法
2.1.1优缺点
优点:
1.算法简单、快速。
2.处理大数据集效率高。
缺点:
1.最后的分类与起始聚类中心的选择有关(对初值敏感)。
2.对孤立点数据敏感。
3.必须事先给出K值。
2.2K-means++算法
K-means++算法是K-means算法的升级版,最主要的不同就是K-means算法选择初始聚类中心的原则。当然也有其他的不同点,乃至有些操作过程不同,不过无关紧要。
K-means算法选择初始聚类中心的原则是:初始的聚类中心之间的距离尽可能的远。
2.2.1探讨K-means++算法:
Q:聚类个数K怎么确定?
A:分几类主要取决于个人的经验与感觉,通常的做法是多尝试几个K值,看分成几类的结果更好解释,更符合分析目的。
Q:数据的量纲不一致怎么办?
A:如果数据的量纲不一样,计算的距离就没有意义。如X1的单位是米,而X2的单位是吨,用距离公式计算出来的单位是,最后算出来的东西没有数学意义。于是要进行标准化处理(规范化处理)。在SPSS中可以进行标准化处理:分析—描述统计—描述—将标准化数据另存为变量。
本算法虽然优化了K-means算法对于孤立点和初值敏感的不足,但仍然需要我们人为指定要分几类,前文也提到过要分几类要依据个人经验和多次操作来判断是否利于解释。
2.3系统(层次)聚类算法
系统(层次)聚类算法不需要人为给定分几类。
系统聚类的合并算法通过计算两类数据点间的距离,对最为接近的两类数据点进行组合,并反复迭代这一过程,直到将所有数据点合成一类,并生产聚类谱系图。
2.3.1样本间距离
绝对值距离:用于网状图
欧式距离:除了用网状图一般都用这个
minkowski距离
chebyshev距离
马氏距离
2.3.2指标间距离
相关系数
夹角余弦
2.3.3类间距离
如何选择看自己能不能解释的通,每种方法都差不多
重心法
最短距离法
最长距离法
组间平均连接法
组内平均连接法
分几类:先画竖线分类,后解释。怎么更好解释怎么来。
2.3.4需要注意的点
1.对于一个实际问题要根据分类的目的来选取指标,指标选取的不同分类结果一般也不同。
2.样本间距离定义方式的不同,聚类结果一般也不同。
3.聚类方法的不同,聚类结果一般也不同。最好能通过各种方法找出其中的共性。
4.要注意指标的量纲,量纲差别太大会导致聚类结果不合理。
5.聚类分析的结果可能不令人满意,因为我们所做的是一个数学的处理,对于结果我们要找到一个合理的解释。
2.3.5肘部法则和聚类系数折线图
用来辅助确定。
肘部法则:通过图形大致的估计出最优的聚类数量。
各个类畸变程度之和:各个类的畸变程度等于该类重心与其内部成员位置距离的平方和,假设一共将n个样本划分到个类中,用表示第个类,且该类重心的位置记为,那么第个类的畸变程度为(这里的绝对值符号意义表示为距离,可视为一种广义记号)。
定义所有类的总畸变程度:,也被称作聚合系数。
聚合系数折线图:横坐标为聚类的类别数,纵坐标为聚合系数。
如何制作聚合系数折线图?
现在SPSS上找到集中计划,找到系数,复制后放到Excel表格内(匹配目标格式),选择降序(阶段数和相反,越小,系数越大,为了制作聚合系数折线图,所以先要降序),选中数据后点击插入,点击推荐的图标,选择散点图。
最后得到上图,随后进行分析。
1.根据聚合系数折线图可知,当类别数为5时,折线的下降趋势缓慢,故可将类别数设定为5。
2.从图中可以看出,值从1到5时,畸变程度变化最大。超过5以后,畸变程度变化显著降低。因此肘部就是,故可将类别数设定为5(选择也能解释)。
2.3.6制作示意图(散点图)
只适用于两、三个指标的情况
先聚类完成,选择少量指标(两到三个),点击图形,点击图标构造器,拖动散点图/点图,拖动指标到X轴和Y轴(如果有Z轴也拖),拖动聚类结果到设置颜色,点击组/点ID,选择点标签,将对象拖到点ID处,最后双击图表后自己美化。
2.4DBSCAN算法(基于密度的聚类算法)
DBSCAN算法全称具有噪音的基于密度的聚类算法,我们前面学习的K-means++算法和系统聚类算法是基于距离的聚类算法。
DBSCAN算法在聚类前不需要预先指定聚类的个数,生成的类的个数也不确定(和数据有关)。该算法基于密度聚类的概念,即要求聚类空间中的一定区域内包含对象的数目不小于某一给定阈值。该方法能在具有噪声的空间数据库中发现任意形状的类,可将密度足够大的相邻区域连接,能有效处理异常数据。
2.4.1基本慨念
MinPts:中文翻译为最少点
三种数据点:
1.核心点:在半径Eps内含有不小于MinPts数目的点
2.边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内
3.噪音点:既不是核心点也不是边界点的
2.4.2优缺点
优点:
1.基于密度定义,能处理任意形状和大小的簇
2.可在聚类的同时发现异常点
3.与K-means比较起来,不需要输入要划分的聚类个数
缺点:
1.对输入参数Eps和MinPts敏感,确定参数困难
2.当聚类密度不均匀时,由于聚类参数Eps和MinPts是不变的,会导致聚类距离相差很大,聚类质量差
3.当数据量大时,计算密度单元的计算复杂度大
2.5建议
只有两个指标,且散点图表示数据非常的“DBSCAN”,再取使用DBSCAN进行聚类分析。
其他情况下,全部使用系统聚类。
K-means也可以用,用了的话论文能写的东西会比较少。
三、代码/操作
3.1K-means++算法
SPSS实现
打开SPSS—导入数据—Excel(最好在桌面)—分析—分类—(K-均值聚类)K-means聚类(实际上是K-means++聚类)—选择变量和个案标注依据(变量可以理解为指标,个案标注依据可以理解为对象)—选择聚类数—迭代(最大迭代次数,随便输个数,如20)—保存(聚类成员和与聚类中心的距离)—选项(初始聚类中心和每个个案的聚类信息)—确定。
最后获得这些图。
3.2系统聚类算法
SPSS实现:
打开SPSS—导入数据—Excel(最好在桌面)—分析—分类—系统聚类分析—选择变量和个案标注依据(变量可以理解为指标,个案标注依据可以理解为对象)—图(勾选谱系图)—方法(选择聚类方法和区间(计算距离的方法),还可以进行标准化操作(按需))—保存(勾选无)。
最后得到上图(聚类谱系图,又称树状图)。
3.3DBSCAN算法(基于密度的聚类算法)
MATLAB实现
主文件
clc;
clear;
close all;
%% Run DBSCAN Clustering Algorithm
epsilon=0.5;%自己调参数
MinPts=10;%自己调参数
IDX=DBSCAN(X,epsilon,MinPts);%X需要自己输入
%% Plot Results
% 如果只要两个指标的话就可以画图啦
PlotClusterinResult(X, IDX);
title(['DBSCAN Clustering (\epsilon = ' num2str(epsilon) ', MinPts = ' num2str(MinPts) ')']);
DBSCAN(放在主文件的同一文件夹内)
function [IDX, isnoise]=DBSCAN(X,epsilon,MinPts)
C=0;
n=size(X,1);
IDX=zeros(n,1); % 初始化全部为0,即全部为噪音点
D=pdist2(X,X);
visited=false(n,1);
isnoise=false(n,1);
for i=1:n
if ~visited(i)
visited(i)=true;
Neighbors=RegionQuery(i);
if numel(Neighbors)<MinPts
% X(i,:) is NOISE
isnoise(i)=true;
else
C=C+1;
ExpandCluster(i,Neighbors,C);
end
end
end
function ExpandCluster(i,Neighbors,C)
IDX(i)=C;
k = 1;
while true
j = Neighbors(k);
if ~visited(j)
visited(j)=true;
Neighbors2=RegionQuery(j);
if numel(Neighbors2)>=MinPts
Neighbors=[Neighbors Neighbors2]; %#ok
end
end
if IDX(j)==0
IDX(j)=C;
end
k = k + 1;
if k > numel(Neighbors)
break;
end
end
end
function Neighbors=RegionQuery(i)
Neighbors=find(D(i,:)<=epsilon);
end
end
PlotClusterinResult(放在主文件的同一文件夹内)
function PlotClusterinResult(X, IDX)
k=max(IDX);
Colors=hsv(k);
Legends = {};
for i=0:k
Xi=X(IDX==i,:);
if i~=0
Style = 'x';
MarkerSize = 8;
Color = Colors(i,:);
Legends{end+1} = ['Cluster #' num2str(i)];
else
Style = 'o';
MarkerSize = 6;
Color = [0 0 0];
if ~isempty(Xi)
Legends{end+1} = 'Noise';
end
end
if ~isempty(Xi)
plot(Xi(:,1),Xi(:,2),Style,'MarkerSize',MarkerSize,'Color',Color);
end
hold on;
end
hold off;
axis equal;
grid on;
legend(Legends);
legend('Location', 'NorthEastOutside');
end
标签:DBSCAN,end,means,模型,算法,MinPts,聚类
From: https://blog.csdn.net/2402_84668171/article/details/140543309