C# 多维K-均值聚类
我正在研究K-means聚类算法。有很多例子,但我找不到一个例子来解释我要做什么 我的数据集包含客户及其购买。数据集中的每1表示客户购买了此商品。0表示不买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个点 现在,我正在尝试从该数据集创建点,以用于下一步。我想创建一个包含所有点对象的
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的客户应该聚集在另一个总共两个集群的集群中?更具体地说:客户与集群点之间的“距离”是多少?购买相同产品的客户会聚集在同一集群中。指定的数据集是整个集合的一部分