在数据库级别使用混合变量的 kmeans 实现

Posted

技术标签:

【中文标题】在数据库级别使用混合变量的 kmeans 实现【英文标题】:kmeans implementation with mixed variable at database level 【发布时间】:2017-08-31 12:25:25 【问题描述】:

我有一个表,其中包含不同数据类型的列(列,如:ProductId、名称、大小、颜色、类、部门等),因为并非所有列都是数字的,我如何将相似的产品聚集在一起。数据位于 Netezza 中,为了快速处理,我只想在数据库端进行,因为数据量很大(大约 200 万行)。

我尝试在 R 中实现 Gower 的相似性,但这需要很多时间。是否有我可以在 netezza 端使用的 UDF?

输入(头(产品))

结构(列表(Product_key = c(“136220083”,“134520094”,“137520230”, "133420231", "137420204", "136520284"), SRO_score = c(2, 2, 2, 3, 3, 1), PRDF_SKU_NAME = c("1496533", "1496534", "1496537", "1496540", "1496541", "1496542"), ATTRIB_VAL1 = c("冠军画布", "冠军 帆布”、“冠军帆布”、“冠军帆布”、“冠军帆布”、 "冠军帆布"), ATTRIB_VAL2 = c("海军帆布", "海军帆布", “红色”、“红色”、“红色”、“红色”)、ATTRIB_VAL3 = c(“9.5W”、“10W”、“7W”、 “8.5W”,“9W”,“9.5W”),ATTRIB_VAL4 = c(“Keds”,“Keds”,“Keds”, "Keds", "Keds", "Keds"), ATTRIB_VAL5 = c("VULCANIZED FOOTWEAR", "硫化鞋", "硫化鞋", "硫化鞋", "硫化鞋履", "硫化鞋履"), ATTRIB_VAL6 = c("WOMENS 传统运动”、“传统女性运动”、“女性运动” 传统”、“传统女性运动”、“传统女性运动”、 "传统女子运动"), ATTRIB_VAL7 = c("1.38 lb", "1.38 lb", “1.38 磅”、“1.38 磅”、“1.38 磅”、“1.38 磅”),ATTRIB_VAL8 = c(“鞋 女性运动”、“女性运动鞋”、“女性运动鞋”、“女性运动鞋” 女性运动”、“女性运动鞋”、“女性运动鞋”)、 ATTRIB_VAL9 = c("女鞋", "女鞋", "女鞋", "女鞋", "女鞋", "女鞋")), .Names = c("Product_key", "SRO_score", "PRDF_SKU_NAME", "ATTRIB_VAL1", “ATTRIB_VAL2”、“ATTRIB_VAL3”、“ATTRIB_VAL4”、“ATTRIB_VAL5”、 “ATTRIB_VAL6”、“ATTRIB_VAL7”、“ATTRIB_VAL8”、“ATTRIB_VAL9”),row.names = c(4107L, 3927L, 4260L, 3794L, 4246L, 4140L), class= "data.frame")

【问题讨论】:

您应该共享数据样本。类似dput(head(data)). @tushaR 更新 【参考方案1】:

您不能只使用具有 Gower 相似性的 k-means。

K-means 也需要计算 means

通常的选择是 PAM,但它的扩展性非常可怕。您不想在完整的数据集上使用它。

与其扩展到整个数据集,不如先使用一个样本来了解该做什么。聚类权困难。您需要将 90% 的时间花在预处理上。

首先弄清楚什么是有效的。然后缩放。反之亦然。

【讨论】:

您能否详细说明一下 PAM 或指导我查看有关它的一些文件?我对此一无所知。非常感谢。 另外,PAM 使用的自定义距离度量是欧几里得或曼哈顿,它们都不处理混合变量。 您可以将 PAM 与 Gower 一起使用。虽然我怀疑 Gower 对您的数据也有用。

以上是关于在数据库级别使用混合变量的 kmeans 实现的主要内容,如果未能解决你的问题,请参考以下文章

使用分类变量的 Kmeans

混合模型初探

高斯混合模型 GMM 的详细解释

如何从集群实现 sklearn -AgglomerativeClustering?

k均值和kmeans的区别

计算熊猫数据框中kmeans的损失函数