我已经实现了k-means聚类来确定300个对象中的聚类。我的每个对象 有大约30个维度。使用欧几里德度量计算距离。
我需要知道
答案 0 :(得分:12)
OP中的两个问题是单独的主题(即答案中没有重叠),因此我将尝试一次一个地回答它们,并盯着列表中的第1项。
与其他无监督的ML技术一样,k-means缺乏一个很好的诊断测试选择来回答诸如“k-means返回的聚类分配对k = 3或k = 5更有意义?”的问题。如何判断我的[聚类]算法是否正常工作?
尽管如此,有一项广泛接受的测试可以产生直观的结果并且可以直接应用。此诊断指标只是此比率:
inter-centroidal分离 / 群内方差
随着此比率的值增加,群集结果的质量会提高。
这很直观。这些指标中的第一个是每个群集与其他群集相隔多远(根据群集中心测量)?
但是单独的质心间分离并不能说明整个故事,因为两个聚类算法可以返回具有相同的质心间分离的结果,尽管一个明显更好,因为聚类“更紧”(即更小的半径) ;换句话说,簇边缘有更多的分离。第二个指标 - 群内方差 - 说明了这一点。这只是每个群集计算的均值方差。
总之,质心间分离与群内方差的比率是一种快速,一致且可靠的技术,用于比较不同聚类算法的结果,或比较相同的结果算法在不同的可变参数下运行 - 例如,迭代次数,距离度量的选择,质心的数量(k的值)。
期望的结果是紧密(小)的集群,每个集群都远离其他集群。
计算很简单:
inter-centroidal separation :
计算聚类中心之间的成对距离;然后
计算这些距离的中位数。
群内方差:
对于每个群集,计算给定群集中每个数据点的距离 它的集群中心;下
(对于每个聚类)计算距上述步骤的距离序列的方差;然后
平均这些方差值。
这是我对第一个问题的回答。这是第二个问题:
欧几里德距离是计算距离的正确方法吗?如果我有100个维度而不是30个怎么办?
首先,简单的问题 - 随着尺寸/特征的增加,欧几里德距离是一个有效的指标吗?
欧氏距离是完全可扩展的 - 适用于二维或两千。对于任何一对数据点:
按元素减去它们的特征向量,
对该结果向量中的每个项目进行平方,
总结该结果,
取该标量的平方根。
这个计算顺序中没有任何地方涉及规模。
但是,欧几里德距离是否适合您的问题的相似度量,取决于您的数据。例如,它是纯数字(连续)吗?或者它是否具有离散(分类)变量(例如,性别?M / F)如果您的某个维度是“当前位置”而200个用户中,100个具有值“旧金山”而另外100个具有“旧金山”波士顿“,你不能说,平均而言,你的用户来自堪萨斯州的某个地方,但这就是欧几里德距离会做的事情。
在任何情况下,由于我们对此一无所知,我只会给您一个简单的流程图,以便您可以将其应用于您的数据并确定适当的相似性指标。
根据您的数据确定适当的相似性指标:
答案 1 :(得分:1)
当尺寸可比且尺度相同时,欧几里德距离良好。如果一个维度表示长度而另一个维度 - 项目的权重 - 欧几里得应该用加权替换。
在2d中显示并显示图片 - 这是视觉上看它是否有效的好选择。 或者您可以使用一些健全性检查 - 比如查找群集中心并查看群集中的所有项目都不会太远。
答案 2 :(得分:1)
难道你不能尝试总和| xi - yi |相反,如果(xi - yi)^ 2 在你的代码中,看看它是否有很大的不同?
我不能有一个图表来说明我算法的正确性。
有几种可能性:
顺便说一句,scipy.spatial.cKDTree 可以轻松地给你说每个点的3个最近邻居, 在p = 2(欧几里德)或p = 1(曼哈顿,L1),来看看。 它快到20d,即使在128d也能提前截止。
<小时/> 补充:我喜欢高维度的Cosine distance;请参阅euclidean-distance-is-usually-not-good-for-sparse-data了解原因。
答案 3 :(得分:1)
欧式距离是连续变量之间的直观距离和“正常”距离。如果噪声太大或数据具有非高斯分布,则可能是不合适的。
您可能想要尝试使用曼哈顿大道距离(或市区街区)更健壮的路线(请记住,坚固性总是要付出代价的:在这种情况下,会丢失一些信息)。
针对特定问题,还有许多其他距离度量标准(例如,计数数据的Bray-Curtis距离)。您可能要尝试从python模块scipy.spatial.distance中以pdist实现的距离。