选择适当的相似性度量并评估 k-means 聚类模型的有效性
Posted
技术标签:
【中文标题】选择适当的相似性度量并评估 k-means 聚类模型的有效性【英文标题】:Selecting an appropriate similarity metric & assessing the validity of a k-means clustering model 【发布时间】:2011-12-27 12:00:34 【问题描述】:我已经实现了 k-means 聚类来确定 300 个对象中的聚类。我的每一个对象 大约有 30 个维度。距离是使用欧几里德度量来计算的。
我需要知道
-
如何确定我的算法是否正常工作?我不能有一个图表
对我的算法的正确性给出一些想法。
欧几里得距离是计算距离的正确方法吗?如果我有 100 个维度怎么办
而不是 30 个?
【问题讨论】:
适当的距离度量取决于数据的类型/来源,但欧几里得距离是一个很好的默认值。 @Larsmans,你能指出一些在 >= 30 d 中支持它的例子吗?不是我不同意,但正如你所说,这取决于;图像分类、文本分类......似乎在针对特定问题的指标上努力工作。 @Denis:查看scikit-learn document clustering example,它使用欧几里得距离对 10.000 个特征。另外,请注意,所有基于 tf-idf 的搜索引擎都使用欧几里得范数,可以将其视为 ad hoc 聚类算法。 @Larsmans,很好的例子,谢谢。但在X = Normalizer(norm="l2")
之后,“两个 l2 归一化 TF-IDF 向量的点积是余弦相似度......对于信息检索社区常用的向量空间模型”——Normalizer doc。因此,在未知数据上,我们与欧几里得 vs L1 相去甚远,这似乎是 OP 的问题。还有更多例子吗?
@Denis:好吧,我并不是说 L1 一定是一个不好的聚类距离度量。但欧几里得似乎更常见,也是合理的默认值。
【参考方案1】:
欧几里得距离是连续变量之间直观且“正常”的距离。如果噪声太大或数据具有非高斯分布,则可能不合适。
您可能想尝试对其稳健的曼哈顿距离(或城市街区)(请记住,稳健性总是有代价的:在这种情况下会丢失一些信息)。
对于特定问题,还有许多进一步的距离度量(例如计数数据的布雷-柯蒂斯距离)。您可能想尝试在 pdist 中从 python 模块 scipy.spatial.distance 中实现的一些距离。
【讨论】:
【参考方案2】:OP 中的两个问题是不同的主题(即答案中没有重叠),所以我会尝试一次一个地回答它们,盯着列表中的第 1 项。
如何确定我的 [聚类] 算法是否正常工作?
与其他无监督机器学习技术一样,k-means 缺乏很好的诊断测试选择来回答诸如“k-means 返回的集群分配对于 k=3 或 k=5 更有意义吗?”之类的问题?
不过,有一种被广泛接受的测试可以产生直观的结果,而且应用起来也很简单。这个诊断指标就是这个比率:
质心间分离 / 簇内方差
随着这个比率值的增加,你的聚类结果的质量也会提高。
这很直观。这些指标中的第一个是每个集群与其他集群的距离(根据集群中心测量)?
但仅质心间分离并不能说明全部情况,因为两种聚类算法可以返回具有相同质心间分离的结果,尽管一个明显更好,因为聚类“更紧密”(即半径更小) ;换句话说,簇边缘有更多的分离。第二个指标——集群内方差——解释了这一点。这只是每个集群计算的平均方差。
总之,质心间分离与聚类内方差的比率是一种快速、一致且可靠的技术,用于比较来自不同聚类算法的结果,或比较来自相同聚类算法的结果算法在不同的可变参数下运行——例如,迭代次数、距离度量的选择、质心数(k 值)。
所需的结果是紧密(小)的集群,每个集群都远离其他集群。
计算很简单:
对于质心间分离:
计算聚类中心之间的成对距离;那么
计算这些距离的中位数。
对于集群内差异:
对于每个集群,计算给定集群中每个数据点的距离 其集群中心;下一个
(对于每个簇)从上述步骤计算距离序列的方差;那么
平均这些方差值。
这是我对第一个问题的回答。这是第二个问题:
欧几里得距离是计算距离的正确方法吗?如果我有 100 个维度而不是 30 个呢?
首先,一个简单的问题——随着维度/特征的增加,欧几里得距离是一个有效的度量吗?
欧几里得距离是完全可扩展的——适用于二维或两千维。对于任何一对数据点:
按元素减去它们的特征向量,
对该结果向量中的每个项目进行平方,
将结果相加,
取那个标量的平方根。
这一系列计算中没有任何地方涉及比例。
但欧几里得距离是否适合您的问题的相似性度量,取决于您的数据。例如,它是纯数字的(连续的)吗?或者它是否也有离散(分类)变量(例如,性别?M/F)如果您的维度之一是“当前位置”并且在 200 个用户中,100 个具有值“旧金山”,其他 100 个具有“波士顿”,你不能真的说,平均而言,你的用户来自堪萨斯州的某个地方,但这就是欧几里得距离会做的事情。
无论如何,由于我们对此一无所知,所以我只给您一个简单的流程图,以便您可以将其应用于您的数据并确定适当的相似性指标。
根据您的数据确定适当的相似性指标:
【讨论】:
感谢@doug 的流程图,你能分享它的参考吗?我有兴趣阅读更多关于此的内容。 @Zhubarb 确定它来自我的仓库(我或多或少是从内存中创建的,尽管我使用标准的教科书资源进行了验证):github.com/alexland/similarity-metrics【参考方案3】:你不能试试 sum |xi - yi|相反,如果 (xi - yi)^2 在你的代码中,看看它是否有很大的不同?
我没有一个图表来说明我的算法的正确性。
几种可能性:
查看 2 个集群之间的一些中间点详细 稍微改变 k,看看会发生什么(你的 k 是多少?) 使用 PCA 将 30d 映射到 2d;见下图 calculating-the-percentage-of-variance-measure-for-k-means, 还有SO questions/tagged/pca顺便说一句,scipy.spatial.cKDTree 可以很容易地给你说每个点的 3 个最近邻, 在 p=2(欧几里得)或 p=1(曼哈顿,L1)中查看。 最快可达 20 天,即使在 128 天也能提前截止。
补充:我喜欢高维的Cosine distance;请参阅euclidean-distance-is-usually-not-good-for-sparse-data 了解原因。
【讨论】:
【参考方案4】:欧几里得距离在尺寸可比较且比例相同时是好的。如果一个维度代表长度,另一个维度代表项目的重量,那么欧几里得应该替换为加权。
将其制作为 2d 并显示图片 - 这是一个很好的选择,可以直观地查看它是否有效。 或者您可以使用一些健全性检查 - 例如找到集群中心并查看集群中的所有项目都不是太远离它。
【讨论】:
以上是关于选择适当的相似性度量并评估 k-means 聚类模型的有效性的主要内容,如果未能解决你的问题,请参考以下文章