如何获得k-means属于集群的概率?

数据挖掘 Python 聚类 k-均值
2021-10-04 10:24:35

我需要获取数据集中每个点的概率。这个想法是计算距离矩阵(第一列包含到第一个集群的距离,第二列包含到第二个集群的距离等)。最近的点的概率 = 1,最远的点的概率 = 0。问题是线性函数(如 MinMaxScaller)的输出几乎所有点的概率几乎相同。

如何为这项任务选择非线性?如何在 python 上自动化这个过程?例如对于最近的点p=1,对于属于 clusterp=0.5的最远的点,对于最远的点 p 是 almols 0。

或者您可以提出另一种计算此概率的方法。

3个回答

让我们简单谈谈k均值的概率泛化:高斯混合模型(GMM)。

k -means 中,您执行以下过程:
- 指定k个质心,随机初始化它们的坐标
- 计算每个数据点到每个质心的距离
- 将每个数据点分配给其最近的质心
- 将质心的坐标更新为分配给它的所有点的平均值
- 迭代直到收敛。

在 GMM 中,您执行以下过程:
- 指定k个多元高斯(称为组件),随机初始化它们的均值和方差
- 计算每个组件产生的每个数据点的概率(有时称为每个组件数据点)
- 将每个数据点分配给它所属的具有最高概率
的组件 - 将组件的均值和方差更新为分配给它的所有数据点的均值和方差
- 迭代直到收敛

您可能会注意到这两个过程之间的相似之处。实际上,k -means 是一个具有固定方差分量的 GMM。在 GMM 下,您正在寻找的概率(我认为)是每个组件对每个数据点承担的责任。

如果您想研究它,可以使用 GMM的scikit-learn 实现,但我猜您只是想要一种快速修改现有代码的方法,在这种情况下,如果您乐于假设您的集群是固定的-variance Gaussians,您可以将距离矩阵元素转换为y=ex (给你一个指数下降),然后计算你的列上的softmax(标准化你的分布,所以 P(Y=1)+P(Y=2)+...+P(Y=k)=1)。

值得指出的是,您的集群是固定方差高斯的假设不一定有效。如果您的尺寸有很大不同的比例,这可能会产生奇怪的结果,因为具有较小数量单位的尺寸看起来更“可能”。在运行集群过程之前标准化您的数据应该可以解决这个问题。

根据定义,kmeans 应确保分配一个点的集群具有最近的质心。因此,在集群中的概率并不是很明确。

如前所述,GMM-EM 聚类为您提供了在每个聚类中的可能性估计,并且显然是一种选择。

但是,如果您想保留 k-means 的球形构造,如果您想为每个点的聚类分配一些“好分数”,您可能可以使用更简单的假设/公式。如果您对总体的一个子集进行抽样,并且想要确定对分配给样本中每个点的集群的信任程度,这可能很有用。

一个简单的“评分”方案可以是首先计算在聚类中使用的所有维度到每个 k 质心的 SQRT z 分数距离。然后假设d1dk 对于每个 k 质心,您可以分配分数

score=1di(n1)/i=1k1di(n1)

在哪里 n 是用于聚类的维数。

为什么这个 (n1)开机 1d? 想想在重力或电磁学的 3 维空间中会发生什么,其中强度以平方距离消散。类似地,k-means 创建了 n 维的球形簇。因此,如果您将每个集群质心视为“能量”的点源,它会随着 d 上升 d 到(n1)权力。结果,在任何随机点,来自任何簇质心的“能量”强度与1di(n1) 在哪里 di是到质心的距离。因此,您可以计算这个介于 0 和 1 之间的良好分数,并根据手头问题的维度和结构了解 k-means 算法对于任何点的“混乱”程度。

您可以找到一个数据点的概率di将被聚集到一个特定的集群中kj,P(kj|di),通过运行 k-means 数百次并计算数据点的次数di被分配到集群kj.

由于集群 ID 在现实生活中没有任何意义,因此您可以通过利用质心的值跨 k-means 迭代识别集群。即,在每个 k-means 收敛之后,根据质心值索引的 id 列表重新映射集群 id。