我正在研究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;
}
}
答案 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之间的值(包括),表示此产品已被购买。 ClusterPoint
和CustomerPoint
之间的距离将是产品重量与客户购买商品的事实之间的差异。将计算所有产品的“距离”,这些距离的总和将导致您必须最小化的总距离。当您有两个群集点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>
值,并使用值1
和0
来表示“已购买商品”。但这是实施细节。