Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多维K-均值聚类_C#_K Means - Fatal编程技术网

C# 多维K-均值聚类

C# 多维K-均值聚类,c#,k-means,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个点 现在,我正在尝试从该数据集创建点,以用于下一步。我想创建一个包含所有点对象的

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

这个特定的k-means问题的一个要点是客户购买的产品集。您有四位客户,他们的购物清单如下:

public class CustomerPoint
{
    public int CustomerId { get; set; }
    public ISet<int> ProductIds { get; set; }
}
public class ClusterPoint
{
    public int ClusterNumber { get; set; }
    public IDictionary<int, float> ProductWeights { get; set; }
}
ProductWeights将是一个字典,它将CustomerId映射为介于0和1之间的值,这两个值都包括在内,表示该产品是否已购买。ClusterPoint和CustomerPoint之间的距离将是产品重量与客户是否购买商品之间的差值。将为所有产品计算距离,这些距离的总和将导致您必须最小化的总距离。当您有两个聚类点CLP0.4、0.1、0.8、0.5和CLP0.2、0.7、0.9、0.9,并且您有一个客户CUP0.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值,并将值1和0用于购买的商品或不购买的商品。但这就是实现细节。

您是要对客户进行集群,还是要对项目进行集群?你想构建多少集群?基于客户ID和产品ID使用X和Y作为实际点坐标没有任何意义。建议您可以订购或安排这些点,但客户ID=4与客户ID=7之间的距离并不比客户ID=7更近。@Progman我想对客户进行聚类。所以我得了10分。集群的数量其实并不重要。可以是1、2或更多。是的,你说得对,但我该如何订购呢。多维部分让我困惑,你想用什么标准来聚集客户?例如,为什么id=4、7和8的客户应该聚集在一起,而id=2的客户应该聚集在另一个总共两个集群的集群中?更具体地说:客户与集群点之间的“距离”是多少?购买相同产品的客户会聚集在同一集群中。指定的数据集是整个集合的一部分