Lab空间中不同距离函数的Kmeans聚类

Posted

技术标签:

【中文标题】Lab空间中不同距离函数的Kmeans聚类【英文标题】:Kmeans clustering on different distance function in Lab space 【发布时间】:2015-08-09 14:57:06 【问题描述】:

问题: 使用 K 均值对 CIE LAB 中的相似颜色像素进行聚类。

我想将 CIE 94 用于 2 个像素之间的距离 Formula of CIE94

我读到的是 Kmeans 在“欧几里得空间”中的工作,其中位置坐标被成本函数最小化,即(平方差之和) 在欧几里得以外的空间中不使用kmeans的原因是 """ 算法通常表现为按距离将对象分配到最近的聚类。标准算法旨在最小化聚类内平方和 (WCSS) 目标,因此通过“最小平方和”进行分配,这完全等效按最小欧几里得距离分配。使用(平方)欧几里得距离以外的不同距离函数可能会阻止算法收敛""(源维基)

那么如何在 LAB SPACE 中使用距离 CIE 94 进行相似颜色聚类?

那么如何解决这个问题呢?这里的最小化函数应该是什么?如果 k 均值欧几里得公式起作用,如何将欧几里得空间映射到实验室空间?这里还有其他方法吗?

【问题讨论】:

如果提供的任何答案解决了您的问题,请接受它,否则请评论为什么它不适合您的需求! 【参考方案1】:

CIE LAB 经常用于聚类的原因是因为它将颜色减少到 2 维(相对于 RGB 具有 3 个颜色通道)。您可以轻松地想到笛卡尔坐标系中每个像素的颜色,而不是点 (x,y) 您有点 (a,b) 从这里您只需执行 2d kmeans。

具体如何实现 kmeans 取决于您。将颜色减少到 2d 空间的好处是我们可以想象网格上的数据,现在我们可以使用任何我们想要的常规距离度量。 Mahalonobis、欧几里得、1范数、街区等。这里的可能性真的无穷无尽。

您不必使用 CIELAB,也可以轻松使用 YCbCr、YUV 或任何其他在二维中表示颜色的颜色空间。如果您想尝试 3d kmeans,您可以使用 rgb、hsv 等。更高维度的一个问题是集群的稀疏性(大方差),最重要的是,增加了计算时间。

只是为了好玩,我包含了两张使用 kmeans 聚类的图像,一张在 LAB 中,一张在 YCbCr 中,您可以看到聚类几乎相同(除了标签不同),只是证明确切的颜色空间无关紧要, 重点是将您的 kmeans 的维度与您的数据的维度相匹配

编辑

您在 cmets 中取得了一些好成绩。我只是证明,通过抽象问题,您可以想象相同基本聚类算法的许多变体。但你是对的,使用 CIELAB 有很多好处

回到距离测量。 Kmeans 有两个步骤,赋值和更新(它与期望最大化算法非常相似)。该距离用于 k-means 的分配步骤。这是一些伪代码

for each pixel 1 to rows*cols
    for each cluster 1 to k
        dist[k] = calculate_distance(pixel, mu[k])

    pixel_id = index k of minimum dist

您将创建一个函数 calculate_distance,它使用来自 cielab94 的 delta_e 计算。此公式使用所有 3 个通道来计算距离。希望这能回答您的问题

注意 我的示例仅使用 2 个颜色通道,忽略了亮度通道。我之所以使用这种技术,是因为尽管存在照明差异(例如阴影),但目标通常是对颜色进行分组。 delta_E 度量不是光照不变的。这可能是您的应用程序所关心的问题,也可能不是,但请记住这一点。

使用平方欧几里得距离的结果

使用城市街区距离的结果

【讨论】:

使用 CIELAB 的原因是它几乎接近人类的感知。 CIELab 颜色空间是一个绝对的颜色空间,它准确地定义了颜色。它不依赖于输入或输出设备。因此,在类似的颜色检索问题中表现更好,在 CIELAB 中人类对颜色差异的感知相同的情况下。效果好的区别是 LAB 空间中的 CIE 94。我不知道如何使用 k 表示这个距离,因为 CIE 94 不是欧几里得距离。 你在 LAB 空间中使用欧几里得距离的 kmeans 进行聚类对吗? 我实际上使用了平方欧几里得距离。我编辑了我的答案,以更好地准确显示新距离测量的使用位置。希望有帮助【参考方案2】:

其他距离函数存在 k-means 变化。

特别是 k-medoids (PAM) 可用于任意距离函数。

【讨论】:

以上是关于Lab空间中不同距离函数的Kmeans聚类的主要内容,如果未能解决你的问题,请参考以下文章

聚类算法 - kmeans

机器学习--Kmeans聚类算法

一种接受任意距离函数的聚类算法

scikit-learn kmeans 用 Ja​​ccard 距离聚类文本

如何使用 KMEANS 计算每个记录的聚类距离?

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用