按观察组的分布进行聚类

数据挖掘 机器学习 r 聚类 相关性 分配
2022-02-18 11:28:05

我有如下数据。就像 A、B、C 所示的组一样。大约有 5400 组数据和每组 15 个观察值(我为每组采样了 6-7 个并将它们粘贴在这里)。

Grp Var1 Var2 Var3 Var4 Var5 Var6 Var7 A 0.74 0.02 196.75 0.11 0.25 42.26 1.00 A 0.73 0.02 194.25 0.12 0.25 38.94 1.00 A 0.74 0.01 191.05 0.12 0.24 40.66 1.00 A 0.74 0.01 186.00 0.12 0.23 42.09 1.00 A 0.73 0.01 217.06 0.12 0.24 40.08 1.00 A 0.78 0.02 214.82 0.13 0.23 40.51 1.00 A 0.78 0.02 223.38 0.13 0.24 41.56 1.00 B 0.61 0.02 319.88 0.12 0.20 21.22 0.87 B 0.59 0.02 311.05 0.12 0.20 21.02 0.88 B 0.59 0.02 302.66 0.12 0.23 25.56 0.86 B 0.60 0.02 312.71 0.13 0.22 26.49 0.83 B 0.57 0.00 326.00 0.12 0.27 30.13 0.64 B 0.57 0.01 349.92 0.13 0.28 31.20 0.65 B 0.56 0.02 355.11 0.13 0.28 30.83 0.64 B 0.56 0.03 295.61 0.13 0.27 30.42 0.62 C 0.62 0.00 546.00 0.24 0.10 9.48 1.00 C 0.60 0.00 544.00 0.24 0.11 10.40 1.00 C 0.59 0.00 542.33 0.24 0.11 10.56 1.00 C 0.57 0.00 541.67 0.24 0.11 9.91 1.00 C 0.56 0.00 539.67 0.24 0.11 11.04 1.00 C 0.56 0.00 539.00 0.23 0.13 12.15 1.00 C 0.53 0.00 538.67 0.23 0.12 11.91 1.00 C 0.54 0.00 539.00 0.24 0.13 11.94 1.00 E 0.91 0.03 513.69 0.07 0.49 30.73 0.70 E 0.93 0.03 506.97 0.07 0.50 34.16 0.65 E 0.82 0.01 549.77 0.09 0.46 29.60 0.73 E 0.82 0.01 541.11 0.09 0.46 28.89 0.70 E 0.84 0.01 514.56 0.09 0.45 27.64 0.67 E 0.87 0.01 516.88 0.09 0.49 33.11 0.61 E 0.86 0.02 512.50 0.09 0.48 32.57 0.66 E 0.88 0.01 476.35 0.09 0.46 30.66 0.70

问:我想根据分布相似性对组进行聚类。例如,A 组和 B 组属于一个集群/细分,因为它们的模式/分布在某些或所有变量中可能相似。
我不想按组和聚类计算斜率或平均值,因为分布似乎不是线性的或正常的。
如果在 R 中有一种方法可以做到这一点,那也会很有帮助。

1个回答

您说“我不想按组和集群计算斜率或平均值,因为分布看起来不是线性的或正常的”,但在我看来,每个组都构成了一个很好的紧凑集群,可以由质心很好地表示该组的。当然,您有 5400 个组,而我只在您的样本中查看其中的四个。也许其他组没有那么好。不过,让我们看一下您提供的数据。这是您在七个维度中的四个维度中的数据。组质心用带有黑色边缘的橙色圆圈标记。

按组的质心数据

在我看来,质心确实很好地代表了组的位置。基于此,我建议按组计算质心,然后对质心进行聚类。(当然,您需要首先对变量进行归一化,因为它们具有如此不同的尺度。)


代码

Centroids = aggregate(df[,2:8], list(df$Grp), mean) 

par(mfrow=c(1,2))
plot(df[,c(2,7)], pch=20, col=df$Grp)
legend("bottomright", legend=levels(df$Grp), pch=20, col=1:4)
points(Centroids[,c(2,7)], pch=21, bg="orange")

plot(df[,c(4,6)], pch=20, col=df$Grp)
legend("topleft", legend=levels(df$Grp), pch=20, col=1:4)
points(Centroids[,c(4,6)], pch=21, bg="orange")