【发布时间】:2018-11-05 01:21:58
【问题描述】:
要理解我的问题,您需要整个数据集:https://pastebin.com/82paf0G8
预处理:我有一个订单列表和 696 个唯一商品编号,并希望根据每对商品一起订购的频率对它们进行聚类。我为每对项目计算了同一订单内出现频率的数量。即两个项目之间的最高出现次数为 489。然后我通过以下方式“计算”相似性/相关性:频率/“所有对的最大频率”(489)。现在我有了我上传的数据集。
相似性/相关性:我不知道我的相似性方法在这种情况下是否是最好的。我还尝试了一种叫做“Jaccard 系数/指数”的东西,但得到了几乎相同的结果。
数据集:数据集包含材料编号 V1 和 V2。而N是0-1之间的两个材料数之间的相关性。
在另一个人的帮助下,我设法创建了一个距离矩阵并使用了 PAM 聚类。
为什么要进行 PAM 聚类? 一位数据科学家建议:您有超过 95% 的配对没有信息,这使得所有这些材料距离相同,单个聚类非常分散。这个问题可以使用 PAM 算法来解决,但你仍然会有一个非常集中的群体。另一种解决方案是增加一个以外的距离的权重。
问题1:矩阵只有567x567。我认为对于聚类我需要 696x696 完整矩阵,即使其中很多都是零。但我不确定。
问题 2: 聚类效果不是很好。我得到非常集中的集群。很多项目都聚集在第一个集群中。此外,根据您验证 PAM 集群的方式,我的集群结果很差。是不是因为相似度分析?我还应该使用什么?是因为 95% 的数据都是零吗?我应该将零更改为其他内容吗?
整个代码和结果:
#Suppose X is the dataset
df <- data.table(X)
ss <- dcast(rbind(df, df[, .(V1 = V2, V2 = V1, N)]), V1~V2, value.var = "N")[, -1]
ss <- ss/max(ss, na.rm = TRUE)
ss[is.na(ss)] <- 0
diag(ss) <- 1
现在使用 PAM 聚类
dd2 <- as.dist(1 - sqrt(ss))
pam2 <- pam(dd2, 4)
summary(as.factor(pam2$clustering))
但我得到了非常集中的集群,如:
1 2 3 4
382 100 23 62
【问题讨论】:
-
您的代码在
ss <- dcast(rbind(df, df[, .(V1 = V2, V2 = V1, N)]), V1~V2, value.var = "N")[, -1]对我来说失败了。 -
ncol(df) # 3 ncol(df[, .(V1 = V2, V2 = V1, N)]) # 4,在 rbind 你有不同数量的列,所以它们不能放在一起。 -
用新的 pastebin 更新了我的帖子,你能再试一次吗?谢谢
标签: r cluster-analysis distance correlation