聚类分析

2 篇文章 1 订阅
1 篇文章 0 订阅

聚类分析

详细内容可以参见 Github 博客

参考文献:

  1. 【数学建模算法与应用第二版】
  2. 【R语言实战(第二版】

原理部分

聚类分析是一种数据归约技术,旨在揭露一个数据集中观测值的子集。它可以把大量的观测值归约为若干个类。这里的类被定义为若干个观测值组成的群组,群组内观测值的相似度比群间相似度高。一般把数据聚类归纳为一种非監督式學習

这不是一个精确的定义,从而导致了各种聚类方法的出现。

样本的相似性度量:

对于定量变量(通常所说的连续量),最常用的是闵式距离(Minkowski)距离,即

d q ( x , y ) = [ ∑ k = 1 p ∣ x k − y k ∣ q ] 1 q , q > 0 d_q(\mathbf{x},\mathbf{y})=[\sum_{k=1}^p|x_k-y_k|^q]^{\frac{1}{q}},q>0 dq(x,y)=[k=1pxkykq]q1,q>0

q = 1 , 2 q=1,2 q=1,2 或者 q → + ∞ q \to +\infty q+ 则分别得到

  1. 绝对值距离:
  2. 欧几里得距离:
  3. 切比雪夫距离:

d ∞ ( x , y ) = max ⁡ 1 ≤ k ≤ p ∣ x k − y k ∣ d_{\infty}(\mathbf{x},\mathbf{y})=\max \limits_{1 \le k\le p}|x_k-y_k| d(x,y)=1kpmaxxkyk

在闵式距离中最常用的是欧氏距离,它的主要优点是当坐标轴进行正交旋转时,欧氏距离是保持不变的。

值得注意的是在采用 Minkowski 距离时,一定要采用相同量纲的变量。故而首先要进行数据的标准化处理

在采用Minkowski 距离时, 还应尽可能地避免变量的多重相关性
(multicollinearity)。多重相关性所造成的信息重叠,会片面强调某些变量的重要性。

有研究表明主成分分析不能消除多变量多重相关性的影响。这会导致参数估计不够准确。相应的解决方案可以采取岭回归:岭回归是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价,获得回归系数更为符合实际、更可靠的回归方法。原理待续~

由于Minkowski 距离的这些缺点,一种改进的距离就是马氏距离(Mahalanobis),定义如下:

d ( x , y ) = ( x − y ) T Σ − 1 ( x − y ) d(x,y)=\sqrt{(x-y)^T\Sigma^{-1}(x-y)} d(x,y)=(xy)TΣ1(xy)

其中 x , y x,y x,y p p p 维总体 Z Z Z 的观测值, Σ \Sigma Σ 为其协方差矩阵,实际中 Σ \Sigma Σ 往往是不知道的,常常需要用样本协方差估计。马氏距离对一切线性变换是不变的,故不受量纲的影响。

样本协方差估计如下:

Σ e s t i m a t e = 1 n − 1 ∑ i = 1 n ( X i − X ‾ ) ( Y i − Y ‾ ) \Sigma_{estimate}=\frac{1}{n-1}\sum_{i=1}^n(X_i-\overline X)(Y_i-\overline Y) Σestimate=n11i=1n(XiX)(YiY)

类与类之间的相似性度量

给定样本类 G 1 , G 2 G_1,G_2 G1,G2 ,有以下一系列方法

一、最短距离法(单联动): (Nearest Neighbor or Single Linkage Method)

D ( G 1 , G 2 ) = min ⁡ x i ∈ G 1 y j ∈ G 2 { d ( x i , y j ) } D(G_1,G_2)=\min \limits_{\scriptstyle{x_i} \in G_1\atop \scriptstyle{y_j} \in G_2}\{d(x_i,y_j)\} D(G1,G2)=yjG2xiG1min{d(xi,yj)}

它的直观意义为两个类中最近两点间的距离

二、最长距离法(全联动):(farthest neighbor or complete linkage method)

它的直观意义为两个类中最远两点间的距离。

三、重心法(质心):

D ( G 1 , G 2 ) = d ( x ˉ , y ˉ ) D(G_1,G_2)=d(\bar{x},\bar{y}) D(G1,G2)=d(xˉ,yˉ)

四、类平均法(平均联动):(group average method)

D ( G 1 , G 2 ) = 1 n 1 n 2 ∑ x i ∈ G 1 ∑ x j ∈ G 2 d ( x i , x j ) D(G_1,G_2)=\frac{1}{n_1n_2}\sum_{x_i \in G_1}\sum_{x_j \in G_2}d(x_i,x_j) D(G1,G2)=n1n21xiG1xjG2d(xi,xj)

五、离差平方和法(Ward法):(sum of squares method)

D ( G 1 , G 2 ) = D 12 − D 1 − D 2 D(G_1,G_2)=D_{12}-D_1-D_2 D(G1,G2)=D12D1D2

离差平方和法最初是由 Ward 在 1936 年提出,后经Orloci 等人1976 年发展起来的,故又称为Ward 方法。

聚类分析根据分类对象的不同可以分为 Q Q Q 型和 R R R 型两大类。

  1. Q Q Q 型聚类分析的作用:对样本进行分类

    • 利用多个变量(指标)对样本进行分类
    • 所得结果比传统的定性分析更细致、全面
  2. R R R 型聚类分析的作用:对变量(指标)进行分类处理

    • 了解变量之间及变量组合之间的亲疏关系

    • 根据聚类结果选择主要变量进行回归分析或者 R R R 型聚类分析

      可见实质上是起到降维的作用

Q Q Q 型聚类

最常用的两种 Q Q Q 型聚类方法是层次聚类(hierarchical agglomerative clustering)和划分聚类(partitioning clustering)。

  1. 层次聚类中,每一个观测值自成一类,这些类每次两两合并,直到所有的类被聚成一类为止。
  2. 在划分聚类中,首先指定类的个数 K K K,然后观测值被随机分成K类,再重新形成聚合的类。

R R R 型聚类法结果可用一个聚类图(树状图)展示出来,树状图应该从下往上读,它展示了这些条目如何被结合成类,高度刻度代表了该高度类之间合并的判定值

层次聚类法(系统聚类法)

设样本空间 Ω = w 1 , w 2 , ⋯   , w n \Omega ={w_1,w_2,\cdots,w_n} Ω=w1,w2,,wn

  1. 计算样本点俩俩之间的距离,得距离矩阵 D = ( d i j ) n × n D=(d_{ij})_{n\times n} D=(dij)n×n

  2. 首先构造 n n n 个类,每一类平台高度均为 0。

  3. 依据类间相似性度量算法选取两类合为一类,并以此两类间的距离值作为新的平台高度

    显然平台高度依赖于类间度量算法,而类间度量算法又依赖于两点间距离测度的选取。

  4. 更新类别与距离矩阵,若类别已经等于1则转至5,否则转至3

  5. 画聚类图

  6. 决定类的个数与类

类别的个数得自己定,一般参考广泛采用的一些指标

当需要嵌套聚类有意义的层次结构时,层次聚类或许特别有用。在生物科学中这种情况很常见。比如需要解释聚类的意义时可以分析不同变量之间的共性。

在某种意义上分层算法是贪婪的,一旦一个观测值被分配给一个类,它就不能在后面的过程中被重新分配。

另外,层次聚类难以应用到有数百甚至数千观测值的大样本中。不过划分方法可以在大样本情况下做得很好。

代码实现

输入: 二维矩阵的聚类样本 ,行表示样本,列表示指标

# 设置路径
setwd("C:/Users/16053/Documents/R/18guosai/聚类分析/")

# 读取数据
nutrient<-read.csv(file="nutrient.csv",header = TRUE)
row.names(nutrient) <- nutrient$X # 第一列改为行名
nutrient<-nutrient[,-1] # 删除第一列

# 标准差法(z-score)进行标准化处理 (无量纲化的一种,均值为0,标准差为1。还有极值差法,【0,1】区间,但要知道最大最小值)
nutrient.scaled <- scale(nutrient) 

# 计算距离矩阵
d <- dist(nutrient.scaled,method = "euclidean")
## method 可选:manhattan——曼哈顿距离、maximum——切比雪夫距离、minkowski——闵式距离

as.matrix(d)[1:4,1:4] #  展现前几个变量的距离
# 绘制距离热力图,非必须
heatmap(as.matrix(d),labRow = F, labCol = F)
# 选取聚类方法
fit.average <- hclust(d, method="average") 
## method 可选:ward.D、ward.D2、single、complete、average、mcquitty(质心)
plot(fit.average, hang=-1, cex=.8, main="Average Linkage Clustering",xlab="聚类指标")

# 选取聚类个数——依赖包中的评价标准
library(NbClust)
nc <- NbClust(nutrient.scaled, distance="euclidean", 
              min.nc=2, max.nc=15, method="average")
par(opar)
table(nc$Best.n[1,])
barplot(table(nc$Best.n[1,]), 
        xlab="Numer of Clusters", ylab="Number of Criteria",
        main="Number of Clusters Chosen by 26 Criteria") 

# 确定最终模型
clusters <- cutree(fit.average, k=5) # 3 参考之前评价标准给出
table(clusters)
aggregate(nutrient, by=list(cluster=clusters), median) 
aggregate(as.data.frame(nutrient.scaled), by=list(cluster=clusters),
          median)
plot(fit.average, hang=-1, cex=.8,  
     main="Average Linkage Clustering\n5 Cluster Solution")
rect.hclust(fit.average, k=5)

# MDS 可视化
mds=cmdscale(d,k=2,eig=T)
x = mds$points[,1]
y = mds$points[,2]
class=factor(clusters)
library(ggplot2)
p=ggplot(data.frame(x,y),aes(x,y))
p+geom_point(size=3, alpha=0.8, aes(colour=class))

距离热力图

层次聚类

K—means 聚类

算法步骤:

  1. 选择 k k k 个中心点(随机选择 k k k 行);
  2. 对每个点确定其聚类中心点。(分配到离他最近的中心点);
  3. 重新计算每类中的新的聚类中心点,即该类数据点的平均值(质心)
  4. 分配每个数据到它最近的中心点;
  5. 重复步骤(3)和步骤(4)直到所有的观测值不再被分配或是达到最大的迭代次数

K-means面对的第一个问题是如何保证收敛,可以证明的是K-means完全可以保证收敛性。

对于每一个样例 i i i,计算其应该属于的类

c ( i ) : = arg ⁡ min ⁡ j ∣ ∣ x ( i ) − μ j ∣ ∣ 2 c^{(i)}:=\arg \min \limits_{j}||x^{(i)}-\mu_j||^2 c(i):=argjminx(i)μj2

对于每一个类 j j j ,重新计算其质心

μ j : = ∑ i = 1 m 1 { c ( i ) = j } x ( i ) ∑ i = 1 m 1 { c ( i ) = j } \mu_j:=\frac{\sum \limits_{i=1}^m\mathbf{1}\{c^{(i)}=j\}x^{(i)}}{\sum \limits_{i=1}^m\mathbf{1}\{c^{(i)}=j\}} μj:=i=1m1{c(i)=j}i=1m1{c(i)=j}x(i)

依据个点被分配到最近的聚类中心可得代价函数

J = 1 m ∑ i = 1 m ∣ ∣ x ( i ) − μ j ∣ ∣ 2 J=\frac{1}{m}\sum_{i=1}^m||x^{(i)}-\mu_j||^2 J=m1i=1mx(i)μj2

不像层次聚类方法,K均值聚类要求你事先确定要提取的聚类个数。另外,在K均值聚类中,类中总的平方值对聚类数量的曲线可能是有帮助的。可

根据图中的弯曲选择适当的类的数量。

代码实现
# 设置路径
setwd("C:/Users/16053/Documents/R/18guosai/聚类分析/")
wine<-read.csv(file="wine.csv",header = FALSE);wine

# 备份类别属性,用于ggplot可视化
True_type<-factor(wine$V1)
df <- scale(wine[-1]) ;df # 对去掉类别属性的一列进行Z-score标准化

# Plot function for within groups sum of squares by number of clusters

wssplot <- function(data, nc=15, seed=1234){
  wss <- (nrow(data)-1)*sum(apply(data,2,var))
  for (i in 2:nc){
    set.seed(seed)
    wss[i] <- sum(kmeans(data, centers=i)$withinss)}
  plot(1:nc, wss, type="b", xlab="Number of Clusters",
       ylab="Within groups sum of squares")}

wssplot(df)    # 看图初步判断聚类个数
library(NbClust) # 用指标说话,判断聚类个数

set.seed(1234)
nc <- NbClust(df, min.nc=2, max.nc=15, method="kmeans")
par(opar)
table(nc$Best.n[1,])
barplot(table(nc$Best.n[1,]), 
        xlab="Numer of Clusters", ylab="Number of Criteria",
        main="Number of Clusters Chosen by 26 Criteria") 
set.seed(1234)
fit.km <- kmeans(df, 3, nstart=25) 
kmeans_result=factor(fit.km$cluster)
fit.km$size
fit.km$centers    # 聚类中心                                       
aggregate(wine[-1], by=list(cluster=fit.km$cluster), mean)# 统计信息

# evaluate clustering
ct.km <- table(wine$V1, fit.km$cluster)
ct.km   # 统计的总体个数分错的情况,对角则完全准确
library(flexclust)
randIndex(ct.km) # 兰德指数

# ggplot
d.kmeans<- dist(df)    # 距离矩阵
mds=cmdscale(d.kmeans,k=2,eig=T) # MDS 缩放降维至2维,方便绘图
x = mds$points[,1]
y = mds$points[,2]
library(ggplot2)
p=ggplot(data.frame(x,y),aes(x,y))
p+geom_point(size=3,alpha=0.8,aes(colour=True_type,shape=kmeans_result))

葡萄酒聚类数的确定

kmeans

划分聚类分析

在划分方法中,观测值被分为 K K K 组并根据给定的规则改组成最有粘性的类

围绕中心点的划分(PAM)

因为K均值聚类方法是基于均值的,所以它对异常值是敏感的。一个更稳健的方法是围绕中心点的划分(PAM)。与其用质心(变量均值向量)表示类,不如用一个最有代表性的观测值来表示(称为中心点)。K均值聚类一般使用欧几里得距离,而PAM可以使用任意的距离来计算。因此,PAM可以容纳混合数据类型,并且不仅限于连续变量。

  1. 随机选择 K K K个观测值(每个都称为中心点);
  2. 计算观测值到各个中心的距离/相异性
  3. 把每个观测值分配到最近的中心点;
  4. 计算每个中心点到每个观测值的距离的总和(总成本)
  5. 选择一个该类中不是中心的点,并和中心点互换;
  6. 重新把每个点分配到距它最近的中心点;
  7. 再次计算总成本;
  8. 如果总成本比步骤(4)计算的总成本少,把新的点作为中心点;
  9. 重复步骤(5)~(8)直到中心点不再改变。

有点类似于单纯形法中基变量的替换,关键是如何寻找新的替换点

代码实现
# 设置路径
setwd("C:/Users/16053/Documents/R/18guosai/聚类分析/")
#基于中心点的划分 PAM
wine<-read.csv(file="wine.csv",header = FALSE);wine
True_type<-factor(wine$V1)
df <- scale(wine[-1]) ;df 

library(cluster)
set.seed(1234)
fit.pam <- pam(wine[-1], k=3, stand=TRUE)  
PAM_result<-factor(fit.pam$clustering)
fit.pam$medoids                                 
clusplot(fit.pam, main="Bivariate Cluster Plot")

# evaluate clustering
ct.pam <- table(wine$V1, fit.pam$clustering)
ct.pam
randIndex(ct.pam)

# ggplot
d.center<- dist(df)    
mds=cmdscale(d.center,k=2,eig=T)
x = mds$points[,1]
y = mds$points[,2]
library(ggplot2)
p=ggplot(data.frame(x,y),aes(x,y))
p+geom_point(size=3,alpha=0.8,aes(colour=True_type,shape=PAM_result))

中心点

此处中心点的结果没有 kmeans 好,兰德指数大大下降

模糊 k-means 聚类

模糊 kmeans 算法是 kmeans 聚类模糊形式。与kmeans算法排他性聚类不同,模糊 kmeans 尝试从数据集中生成有重叠的簇。在研究领域,这也叫做模糊c-means算法,可以把模糊 kmeans 看作 kmeans 算法的扩展。

kmeans 致力于寻找硬簇(一个数据集点只属于某一个簇)。在一个软聚类算法中,任何点都属于不止一个簇,而且该点到这些簇之间都有一定大小的吸引度。这种吸引度与该点到这个簇中心距离成比例。

模糊kmeans有一个参数 m m m ,叫做模糊因子。与 kmeans 不同的是,模糊因子引入不是把向量分配到最近的中心,而是计算每个点到每个簇的关联度

假设一个向量 v v v ,到 k k k 个簇的距离分别是 d 1 , d 2 , ⋯ &ThinSpace; , d k d_1,d_2,\cdots,d_k d1,d2,,dk ,则向量到第 i i i 个簇的关联度为:

u i = 1 ( d i d 1 ) 2 m − 1 + ( d i d 2 ) 2 m − 1 + ⋯ ( d i d k ) 2 m − 1 u_i=\frac{1}{(\frac{d_i}{d_1})^{\frac{2}{m-1}}+(\frac{d_i}{d_2})^{\frac{2}{m-1}}+\cdots(\frac{d_i}{d_k})^{\frac{2}{m-1}}} ui=(d1di)m12+(d2di)m12+(dkdi)m121

用这个代替 kmeans 中距离聚类中心的距离进行聚类。聚类中心不变后每个点被分配到其关联向量中最大元的类,但是实际上它也有可能属于其它类,只不过概率比较小。

模糊聚类最大的好处在于允许模糊值的存在,丛刻允许两簇的聚类中心考的近一些,这个值由模糊系数来调节 。

基于密度的聚类算法

是为了挖掘有任意形状特性的类别而发明的。此算法把一个类别视为数据集中大于某阈值的一个区域。DBSCANOPTICS是两个典型的算法。

DBSCAN是一种基于密度的聚类算法,这类密度聚类算法一般假定类别可以通过样本分布的紧密程度决定

同一类别的样本,他们之间的紧密相连的,也就是说,在该类别任意样本周围不远处一定有同类别的样本存在。

通过将紧密相连的样本划为一类,这样就得到了一个聚类类别。通过将所有各组紧密相连的样本划为各个不同的类别,则我们就得到了最终的所有聚类类别结果。

DBSCAN,英文全写为 Density-based spatial clustering of applications with noise,是在1996年由Martin Ester, Hans-Peter Kriegel , Jörg Sander及Xiaowei Xu提出的聚类分析算法,这个算法是以密度为本的:给定某空间里的一个点集合,这算法能把附近的点分成一组(有很多相邻点的点),并标记出位于低密度区域的局外点(最接近它的点也十分远),DBSCAN是其中一个最常用的聚类分析算法,也是其中一个科学文章中最常引用的。

密度定义

DBSCAN 是基于一组邻域来描述样本集的紧密程度的,参数 ( ϵ , M i n P t s ) (\epsilon, MinPts) (ϵ,MinPts) 用来描述邻域的样本分布紧密程度。其中, ϵ \epsilon ϵ 描述了某一样本的邻域距离阈值, M i n P t s MinPts MinPts 描述了某一样本的距离为 ϵ \epsilon ϵ 的邻域中样本个数的阈值。

设样本定义为 D = ( x 1 , x 2 , ⋯ &ThinSpace; , x n ) D=(x_1,x_2,\cdots,x_n) D=(x1,x2,,xn) ,则 DBSCAN 具体的密度描述如下:

ϵ \epsilon ϵ 邻域:对于 x j ∈ D x_j \in D xjD,其 ϵ \epsilon ϵ 邻域包含样本集 D D D 中与 x j x_j xj 的距离不大于 ϵ \epsilon ϵ 的子样本集

N ϵ ( x j ) = { x i ∈ D ∣ d i s t a n c e ( x i , x j ) ≤ ϵ } N_{\epsilon}(x_j)=\{x_i \in D|distance(x_i,x_j) \le \epsilon\} Nϵ(xj)={xiDdistance(xi,xj)ϵ}

核心对像: 对于任一样本 x j ∈ D x_j \in D xjD,如果其 ϵ \epsilon ϵ 邻域对应的 N ϵ ( x j ) N_{\epsilon}(x_j) Nϵ(xj) 至少包含 M i n P t s MinPts MinPts 个样本,即如果

∣ N ϵ ( x j ) ∣ ≥ M i n P t s |N_{\epsilon}(x_j)| \ge MinPts Nϵ(xj)MinPts

x j x_j xj 是核心对象。

img

DBSCAN密度聚类思想与算法

由密度可达关系导出的最大密度相连的样本集合,即为我们最终聚类的一个类别,或者说一个簇。

那么怎么才能找到这样的簇样本集合呢?DBSCAN使用的方法很简单,它任意选择一个没有类别的核心对象作为种子,然后找到所有这个核心对象能够密度可达的样本集合,即为一个聚类簇。接着继续选择另一个没有类别的核心对象去寻找密度可达的样本集合,这样就得到另一个聚类簇。一直运行到所有核心对象都有类别为止。

算法:

img

基本上这就是DBSCAN算法的主要内容了,但是我们还是有三个问题没有考虑。

  1. 第一个是一些异常样本点或者说少量游离于簇外的样本点,这些点不在任何一个核心对象在周围,在DBSCAN中,我们一般将这些样本点标记为噪音点。
  2. 第二个是距离的度量问题,即如何计算某样本和核心对象样本的距离。在DBSCAN中,一般采用最近邻思想,采用某一种距离度量来衡量样本距离,比如欧式距离。这和 KNN 分类算法的最近邻思想完全相同。对应少量的样本,寻找最近邻可以直接去计算所有样本的距离,如果样本量较大,则一般采用 KD 树或者 球树 来快速的搜索最近邻。如果对于最近邻的思想,距离度量,KD树和球树不熟悉,建议参考另一篇文章K近邻法(KNN)原理小结
  3. 第三种问题比较特殊,某些样本可能到两个核心对象的距离都很小,但是这两个核心对象由于不是密度直达,又不属于同一个聚类簇,那么如果界定这个样本的类别呢?一般来说,此时DBSCAN采用先来后到,先进行聚类的类别簇会标记这个样本为它的类别。也就是说BDSCAN的算法不是完全稳定的算法。
代码实现
%
% Copyright (c) 2015, Yarpiz (www.yarpiz.com)
% All rights reserved. Please read the "license.txt" for license terms.
%
% Project Code: YPML110
% Project Title: Implementation of DBSCAN Clustering in MATLAB
% Publisher: Yarpiz (www.yarpiz.com)
% 
% Developer: S. Mostapha Kalami Heris (Member of Yarpiz Team)
% 
% Contact Info: sm.kalami@gmail.com, info@yarpiz.com
%
clc;
clear;
close all;
%% Load Data
data=load('mydata');
X=data.X;
%% Run DBSCAN Clustering Algorithm
epsilon=0.5;
MinPts=10;
IDX=DBSCAN(X,epsilon,MinPts);
%% Plot Results
PlotClusterinResult(X, IDX);
title(['DBSCAN Clustering (\epsilon = ' num2str(epsilon) ', MinPts = ' num2str(MinPts) ')']);
%fig2plotly();

R R R 型聚类分析

在系统分析或评估过程中,为避免遗漏某些重要因素,往往在一开始选取指标时,尽可能多地考虑所有的相关因素。而这样做的结果,则是变量过多,变量间的相关度高,给系统分析与建模带来很大的不便。因此,人们常常希望能研究变量间的相似关系,按照变量的相似关系把它们聚合成若干类,进而找出影响系统的主要因素

变量相似性度量

一、相关系数:

计变量 x j x_j xj 的取值为 ( x 1 j , x 2 j , ⋯ &ThinSpace; , x n j ) T ∈ R n , j = 1 , 2 , ⋯ &ThinSpace; , m (x_{1j},x_{2j},\cdots,x_{nj})^T \in R ^n,j=1,2,\cdots,m (x1j,x2j,,xnj)TRn,j=1,2,,m 。则变量 x j , x k x_j,x_k xj,xk 相关性度量:

r j k = ∑ i = 1 n ( x i j − x ˉ j ) ( x i k − x ˉ k ) [ ∑ i = 1 n ( x i j − x ˉ j ) 2 ∑ i = 1 n ( x i k − x ˉ k ) 2 ] 1 / 2 r_{jk}=\frac{\sum \limits_{i=1}^n(x_{ij}-\bar{x}_{j})(x_{ik}-\bar{x}_k)}{[\sum \limits_{i=1}^n(x_{ij}-\bar{x}_{j})^2\sum \limits_{i=1}^n(x_{ik}-\bar{x}_{k})^2]^{1/2}} rjk=[i=1n(xijxˉj)2i=1n(xikxˉk)2]1/2i=1n(xijxˉj)(xikxˉk)

在对变量进行聚类分析时,利用相关系数矩阵是最多的。

二、夹角余弦:

r j k = x j ⋅ x k ∣ ∣ x j ∣ ∣ ⋅ ∣ ∣ x k ∣ ∣ r_{jk}=\frac{x_j\cdot x_k}{||x_j||\cdot||x_k||} rjk=xjxkxjxk

变量聚类法

类似于样本集合聚类分析中最常用的最短距离法、最长距离法等,变量聚类法采用了与系统聚类法相同的思路和过程。

其中单一变量间的距离:

d j k = 1 − ∣ r j k ∣ o r d j k 2 = 1 − r j k 2 d_{jk}=1-|r_{jk}| \quad or \quad d_{jk}^2=1-r_{jk}^2 djk=1rjkordjk2=1rjk2

由于用处较少本处不给出代码,和层次聚类差不多

K-means 与 dbscan 算法比较

一般来说,如果数据集是稠密的,并且数据集不是凸的,那么用DBSCAN会比K-Means聚类效果好很多。如果数据集不是稠密的,则不推荐用DBSCAN来聚类。

所谓凸的,即指同一类集合构成的集合近似为凸集

聚类算法评价指标

样本点有标签时

通常没有

Rand index(兰德指数)(RI)

R I = a + b C n s a m p l e s 2 RI=\frac{a+b}{C_{n_{samples}}^2} RI=Cnsamples2a+b

其中 C C C 表示实际类别信息, K K K 表示聚类结果。 a a a 表示在 C , K C,K C,K 中都是同类别的元素对数, b b b 是在两者都是不同类别的元素对数。

即从所有样本中任选两个点,聚类结果和实际结果均一样的配对数为 a a a 。均不一样的配对数为 b b b 。完全准确的情况 a = C n s a m p l e s 2 , b = 0 a=C_{n_{samples}}^2,b=0 a=Cnsamples2,b=0

RI 越大表示聚类效果准确性越高,同时每个类内的纯度越高

调整兰德指数

为了实现“在聚类结果随机产生的情况下,指标应该接近零”,调整兰德系数(Adjusted rand index)被提出,它具有更高的区分度:

A R I = R I − E [ R I ] max ⁡ ( R I ) − E [ R I ] ARI=\frac{RI-E[RI]}{\max(RI)-E[RI]} ARI=max(RI)E[RI]RIE[RI]

这需要多次进行聚类。 A R I ∈ [ − 1 , 1 ] ARI \in [-1,1] ARI[1,1] 越大与真实情况越吻合。从广义的角度来讲,ARI衡量的是两个数据分布的吻合程度。

数据没有标签

Dunn Validity Index (邓恩指数)(DVI)

D V I = min ⁡ 0 &lt; m ≠ n &lt; K { min ⁡ ∀ x i ∈ Ω m ∀ x j ∈ Ω n { ∥ x i − x j ∥ } } max ⁡ 0 &lt; m ≤ K max ⁡ ∀ x i , x j ∈ Ω m { ∥ x i − x j ∥ } DVI = \frac{ \min \limits_{0 &lt; m \ne n &lt; K} \left\{ { \min \limits_{\scriptstyle\forall {x_i} \in {\Omega _m} \atop \scriptstyle\forall {x_j} \in {\Omega _n}} \left\{ {\left\| {x_i - x_j} \right\|} \right\}} \right\}} { \max \limits_{0 &lt; m \le K} \max \limits_{\forall x_i,x_j\in {\Omega _m}} \left\{ {\left\| {x_i - x_j} \right\|} \right\}} DVI=0<mKmaxxi,xjΩmmax{xixj}0<m̸=n<KminxjΩnxiΩmmin{xixj}

DVI计算 任意两个簇元素的最短距离(类间)除以任意簇中的最大距离(类内)

DVI越大意味着类间距离越大 同时类内距离越小

R 语言中 Nbclust 评价指标

R 中整合了30个评价指标,并通过打分与图像变换的趋势来给出最佳聚类。但是其推荐的最佳不一定是最好的,因为有可能有的分数一样,它默认推荐第一个

  1. The Hubert index is a graphical method of determining the number of clusters.

    the plot of Hubert index, we seek a significant knee that corresponds to a significant increase of the value of the measure i.e the significant peak in Hubert index second differences plot.

  2. The D index is a graphical method of determining the number of clusters.

    In the plot of D index, we seek a significant knee (the significant peak in Dindex second differences plot) that corresponds to a significant increase of the value of the measure.

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值