K-means聚类多维

时间:2018-05-09 19:01:03

标签: c# k-means

我正在研究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;
    }
}

1 个答案:

答案 0 :(得分: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<int, float>值,并使用值10来表示“已购买商品”。但这是实施细节。