对类别中的单个数据执行聚类

数据挖掘 r 聚类
2022-02-17 20:58:28

我正在寻找在仍然使用单个数据的同时对聚合类别执行聚类的方法。

例如,假设我们有大量通过不同渠道获得的用户。我想将多组频道聚集在一起,以便以类似的方式更容易处理类似的频道。但是,如果我将用户数据汇总为每个渠道的平均值,那么由于这些平均值很大程度上是由异常值(高消费者)驱动的,因此无法深入了解该渠道中大多数用户的行为。

有没有办法使用个人用户数据,但仍然可以根据他们来自的渠道深入了解和聚类?

2个回答

与往常一样,聚类是关于距离的含义,因为它至少编码了您问题的一部分。所以你的问题是哪些渠道是相似的,哪些相似性是在用户身上定义的。通常您不会假设您的实例上有一些嵌套,但您所拥有的基本上是通道中的用户嵌套。所以你必须将这种嵌套合并到距离/相似度函数中。

我将从对相似函数的一些观察开始。我们表示实例之间的相似性ijd(i,j). 通常这个函数服从以下条件d(i,j)0对于任何ij. 请注意,我们通常仅在相同的数据点上具有相等性。这一观察的主要结果是我们基本上可以在用户级别拥有一个身份。您想要的是频道级别的身份。

一种方法是定义相似函数,如:

dc(i,j)=Icicjd(i,j)

在哪里Icicj1当实例通道i与实例通道不同j. 主要效果是现在来自同一通道的所有点都被认为是相同的,因为它们之间的距离为零。当恒等函数为1距离由您的实际业务距离给出,该距离应由您构建并回答您的问题。

如果您在层次聚类中使用这种功能,基本上它会首先找到一些与您在频道上的分组相同的聚类,然后它会加入相似的聚类。这种方法甚至适用于 kmeans 算法,也许适用于大多数聚类方法。

稍微不同的方法是定义您的I返回函数1λ当集群不同时λ当通道相等时,并且有λ接近的正值0. 这并不能保证所有客户端都进入同一个集群,但它给您带来的好处是您有一个滑块,您可以使用它来微调同一频道的所有用户进入同一个集群距离之间的折衷对异常值更稳健的度量

从实现的角度来看,一种完全不同的方法是直接在通道样本上定义更复杂的函数。这与层次聚类的工作方式类似,因为为了加入聚类,它应该有一个距离函数,可以测量聚类间的相似性。请参阅有关链接标准的更多信息。例如平均链接聚类。请注意,我说过该方法仅在算法上有所不同。我敢打赌,结果与第一种方法相似。

一种完全不同的方法是使用更稳健的标准。众所周知,样本平均值并不稳健,因为一个点可能会破坏估计。相反,中位数非常稳定。您可以使用中值或修剪后的平均值来获得更稳健的聚合值。这样做的好处是集群会更快,因为您将使用通道而不是客户端,并且计算集群的运行时间将减少。

最后,我想到的另一种方法是进一步比较频道,但这次使用基于统计测试的距离。我会给你一个场景来澄清。假设您的用户有一个名为Weight的属性,正如预期的那样,它是一个连续变量。您如何定义一个渠道的用户权重与另一渠道的用户权之间的距离?如果您可以假设一个分布,例如该权重的高斯分布,您可以在两个样本(即两个集群)上建立一个两个样本 t 检验。如果您不能假设分布,则可以采用同质性/独立测试,例如两个样本 KS 测试. KS 测试很有价值,因为它不假设任何分布并且对形状和位置的变化都很敏感。如果您有名义属性,您可以使用卡方独立性检验小心你可以从这些测试中使用什么。为了对距离函数中使用的每个属性有相同的贡献,您必须使用 p 值。另请注意,如果测试显着,它将具有较小的 p 值,因为两个测试的零假设是独立假设,可以将其转换为两个样本的相同边际。因此,较小的 p 值意味着更大的距离。您可以使用1p_value甚至你可以试试1p_value.

想到的最简单的事情是对每个频道的用户进行聚类,然后通过它们的聚类参数比较频道。如果您使用非概率模型(例如 k-means),则可以直接比较集群参数。由于某些技术原因,对于大量集群,这不是一个好主意。如果您使用概率模型,您会看到类似KLD的东西。