层次聚类可以用树状图表示。在一定水平上切割树状图可得到一组簇。切割到另一个级别将提供另一组群集。您将如何选择在哪里切割树状图?有什么可以考虑的最佳点吗?如果我查看随时间变化的树状图,是否应该在同一时间剪切?
层次聚类可以用树状图表示。在一定水平上切割树状图可得到一组簇。切割到另一个级别将提供另一组群集。您将如何选择在哪里切割树状图?有什么可以考虑的最佳点吗?如果我查看随时间变化的树状图,是否应该在同一时间剪切?
Answers:
由于聚类分析本质上是一种探索性方法,因此没有明确的答案。最终的层次结构的解释取决于上下文,并且从理论的角度来看,通常有几种解决方案同样好。
在一个相关的问题中给出了一些线索,在实践中使用了哪些聚集准则的停止标准?我通常使用视觉标准(例如轮廓图)和某种数字标准,例如Dunn的有效性指数,Hubert的伽玛,G2 / G3系数或校正的Rand指数。基本上,我们想知道原始距离矩阵在聚类空间中的近似程度,因此,对相关关系的度量也很有用。我还使用了具有多个起始值的k均值和间隙统计量(mirror)来确定使SS内最小化的簇数。与Ward分层集群的一致性给出了集群解决方案稳定性的想法(您可以使用matchClasses()
在e1071软件包中)。
您将在CRAN Task View Cluster中找到有用的资源,包括pvclust,fpc,clv等。同样值得一试的是clValid软件包(在Journal of Statistics Software中进行了描述)。
现在,如果您的集群随时间而变化,这将更加棘手。为什么选择第一个群集解决方案而不是另一个?您是否期望随着时间的流逝,一些人从一个集群迁移到另一个集群?
有一些方法可以尝试匹配具有最大绝对或相对重叠的聚类,如上一个问题中向您建议的。查看比较聚类 -Wagner和Wagner 的概述。
真的没有答案。在1到N之间。
但是,您可以从利润的角度考虑它。
例如,在市场营销中,人们使用细分,这非常类似于聚类。
为每个人量身定制的消息(例如广告或信件)将具有最高的响应率。为平均值量身定制的通用消息将具有最低的响应率。说了适合三个细分市场的三个消息将介于两者之间。这是收入方面。
针对每个人量身定制的消息的成本最高。为平均值量身定制的通用消息将具有最低的成本。为三个细分量身定制的三个消息将介于两者之间。
假设支付给编写者编写自定义消息的费用为1000,两次费用为2000,依此类推。
用一条消息说,您的收入将是5000。如果将客户划分为2个细分市场,并针对每个细分市场编写量身定制的消息,您的响应率将会更高。假设收入现在为7500。通过三个细分,响应率稍高,您的收入为9000。再细分一个,则您的收入为9500。
为了使利润最大化,请保持细分,直到细分产生的边际收益等于细分的边际成本。在此示例中,您将使用三个细分来最大化利润。
Segments Revenue Cost Profit
1 5000 1000 4000
2 7500 2000 5500
3 9000 3000 6000
4 9500 4000 5500
也许最简单的方法之一是图形表示,其中x轴是组数,y轴是距离或相似度的任何评估指标。在该图中,通常可以观察到两个不同的区域,即线的“拐点”处的x轴值是“最佳”簇数。
也有一些统计数据可以帮助完成这项任务:休伯特伽马,伪t²,伪F或三次聚类标准(CCC)等。
并不是真正的答案,而是工具箱的另一个有趣的想法。
在分层聚类中,输出分区的数量不仅是水平分割,而且还包括决定最终聚类的非水平分割。因此,这可以看作是除了1.距离度量和2.链接准则之外的第三个准则。 http://en.wikipedia.org/wiki/Hierarchical_clustering
您提到的标准是第三类,它是对层次结构中的分区集的一种优化约束。本文正式介绍了这一点,并给出了分割示例!
正如其他答案所说,这绝对是主观的,并且取决于您要研究的粒度类型。对于一般方法,我将其裁剪为2个聚类和1个离群值。然后,我将重点放在两个群集上,以查看它们之间是否有重要的区别。
# Init
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
# Load data
from sklearn.datasets import load_diabetes
# Clustering
from scipy.cluster.hierarchy import dendrogram, fcluster, leaves_list
from scipy.spatial import distance
from fastcluster import linkage # You can use SciPy one too
%matplotlib inline
# Dataset
A_data = load_diabetes().data
DF_diabetes = pd.DataFrame(A_data, columns = ["attr_%d" % j for j in range(A_data.shape[1])])
# Absolute value of correlation matrix, then subtract from 1 for disimilarity
DF_dism = 1 - np.abs(DF_diabetes.corr())
# Compute average linkage
A_dist = distance.squareform(DF_dism.as_matrix())
Z = linkage(A_dist,method="average")
# Dendrogram
D = dendrogram(Z=Z, labels=DF_dism.index, color_threshold=0.7, leaf_font_size=12, leaf_rotation=45)
hopack
(和其他软件包)可以估计群集的数量,但是并不能回答您的问题。