【问题标题】:K-means clustering multiple dimensionsK-means 聚类多个维度
【发布时间】:2018-05-10 04:25:19
【问题描述】:

我正在研究 K-means 聚类算法。有很多可用的示例,但我找不到解释我正在尝试做什么的示例。

我的数据集包含客户及其购买。数据集中的每 1 表示客户购买了该商品。 0 表示未购买。

0,0,0,0,1,0,1,0,0,1
1,0,0,1,0,0,0,1,1,0
1,1,0,0,0,0,0,0,0,0
0,0,0,0,1,1,1,0,0,0

从左到右代表不同的项目。 从上到下代表客户。我想聚集客户。所以数据集中有 4 个维度,会有 10 个点。

现在我正在尝试从该数据集中创建点以用于后续步骤。我想创建一个包含所有点对象的列表,然后将它们分配给正确的集群,但我不知道在创建点对象时如何处理这 4 个不同的维度。

class Point
{
    public int ClusterNumber { get; set; }
    public int X { get; set; }
    public int Y { get; set; }

    public Point(int clusterNumber, int CustomerId, int ProductId)
    {
        ClusterNumber = clusterNumber;
        X = CustomerId;
        Y = ProductId;
    }
}

【问题讨论】:

  • 您要对客户进行聚类还是对商品进行聚类?你想建多少个集群?
  • 使用 XY 作为基于客户 ID 和产品 ID 的实际点坐标没有任何意义。建议您可以“订购”这些点或“排列”它们,但客户 ID=4 并不比客户 ID=7 更“接近”点(物品也是如此)。
  • @Progman 我想对客户进行集群。所以我得到10分。集群的数量并不重要。可以是 1,2 或更多。是的,你是对的,但我应该如何订购它们。多维部分让我一头雾水
  • 您希望通过什么指标来聚集客户?为什么要将 id=4、7 和 8 的客户聚集在一起,而将 id=2 的客户放在另一个集群中(以总共两个集群为例)?更具体地说:客户与聚类点之间的“距离”是多少?
  • 购买相同产品的客户聚集在同一个集群中。 (指定的数据集是总集的一部分)

标签: c# k-means


【解决方案1】:

这个特定的 k-means 问题的重点是客户购买的产品集。您有四个客户及其购买商品的清单,所以应该是这样的:

public class CustomerPoint
{
    public int CustomerId { get; set; }
    public ISet<int> ProductIds { get; set; }
}

那么聚类点将是一些抽象点(不像abstract c# 关键字中的那样),如下所示:

public class ClusterPoint
{
    public int ClusterNumber { get; set; }
    public IDictionary<int, float> ProductWeights { get; set; }
}

ProductWeights 将是一个字典,它将 CustomerId 映射到 0 和 1 之间的值(都包括),这表明该产品是否已购买。 ClusterPointCustomerPoint 之间的距离将是产品重量与客户是否购买该商品的事实之间的差异。将为所有产品计算“距离”,这些距离的总和得出您必须最小化的总距离。当您有两个聚类点 CLP(0.4, 0.1, 0.8, 0.5)CLP(0.2, 0.7, 0.9, 0.9) 并且您有一个客户 CUP(0, 1, 1, 0) 时,差异如下:

CLP1:
    |0 - 0.4|² = 0.16
    |1 - 0.1|² = 0.81
    |1 - 0.8|² = 0.04
    |0 - 0.5|² = 0.25
               ------
                 1.26
CLP2:
    |0 - 0.2|² = 0.04
    |1 - 0.7|² = 0.09
    |1 - 0.9|² = 0.01
    |0 - 0.9|² = 0.81
               ------
                 0.95

所以客户“更接近”第二个聚类点,所以它被分配到那个。

也许您也可以将CustomerPoint.ProductIds 属性更改为IDictionary&lt;int, float&gt; 值,并使用10 值来表示“是否购买了该物品”。但这是实现细节。

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 2021-12-10
    • 1970-01-01
    • 2015-04-11
    • 2011-08-13
    • 2013-08-08
    • 2013-02-14
    • 2018-01-14
    • 2017-10-02
    相关资源
    最近更新 更多