【问题标题】:Memory issue with K-means clusteringK-means 聚类的内存问题
【发布时间】:2019-11-18 10:54:33
【问题描述】:

我正在尝试使用 K 表示聚类对搜索历史记录中的关键短语进行聚类,但是当我运行 stringdistmatrix() 命令时遇到错误“无法分配大小为 30gb 的向量”。我使用的数据集包含 63455 个唯一元素,因此生成的矩阵需要大约 30gb 的内存来处理。有没有办法在不失去太多意义的情况下降低流程的要求?

如果您碰巧发现任何其他错误,以下是我尝试运行的代码:

#Set data source, format for use, check consistency
MyData <- c('Create company email', 'email for business', 'free trial', 'corporate pricing', 'email cost')
summary(MyData)


#Define number of clusters
kclusters = round(0.90 * length(unique(MyData)))

#Compute distance between words
uniquedata <- unique(as.character(MyData))
distancemodels <- stringdistmatrix(uniquedata, uniquedata, method="jw")

#Create Dendrogram
rownames(distancemodels) <- uniquedata
hc <- hclust(as.dist(distancemodels))
par(mar = rep(2, 4))
plot(hc)

#Create clusters from grouped keywords
dfClust <- data.frame(uniquedata, cutree(hc, k=kclusters))
names(dfClust) <- c('data','cluster')
plot(table(dfClust$cluster))

#End view
view(dfClust)

【问题讨论】:

    标签: r k-means


    【解决方案1】:

    我不知道在进行 k 均值聚类时有什么方法可以避免生成距离矩阵。

    您可以考虑为避免内存问题而设计的替代聚类算法。想到的主要是 CLARA(大型应用程序集群;Kaufman and Rousseeuw 1990)。在 R 中,它就像 cluster::clara 一样简单,只获取数字数据(如 k-means)并要求您提前设置 k

    阅读手册 (?cluster::clara) 尤其是关于您应该设置高于默认值的样本数量。希望对您有所帮助!

    编辑:刚刚注意到您实际上并没有数字数据开始,所以也许 CLARA 并不是那么有用。您也许可以使用与 CLARA 相同的一些原则,包括多次采样数据以减少内存占用并在以后组合结果。

    【讨论】:

    • 您认为使用词频是一种值得的抽样方法吗?例如如果前 5 个常用词是“cat”、“dog”、“mouse”、“house”、“tree”,是否只从包含这些词的短语中创建一个矩阵?
    • 即使没有采样,您也可以始终减少单词数量的大小以减小相异矩阵的大小。矩阵的大小与项目数的平方成正比,因此将 30GB 降低到例如7.5GB 只需要您删除一半的元素。正如您所说,您会选择最有用的一半单词,例如最常见的,如果这表明相关性。
    猜你喜欢
    • 2016-02-25
    • 2018-04-05
    • 2020-08-27
    • 2015-04-11
    • 2011-08-13
    • 2013-08-08
    • 2013-02-14
    • 2018-01-14
    • 2010-11-17
    相关资源
    最近更新 更多