我正在寻找一种实现半监督聚类的方法,可能是R中的constrained clustering,特别是“无法链接”的部分(我想 - 但见下文)。我找到了this question,但我不知道这些语言。
我有一个特定的数据集(单词索引),如下所示:
11 195 752 67 77
243 130
8 2178 2581 201 129 77
3872 8967 282
880 77
65 535 363 282
每行上的第一个索引是有向无环图上的“叶子”,即树/层次结构。数据库中有多个单词hierarcies / trees;每行的最后一项是根/顶级节点(语义上,最一般/抽象的单词),因此一行代表从叶到根的路径。我想我最终想要得到的只是尺寸减小:而不是说1000个独特的单词会有200个单词的集合,这在处理有限的数据(小文本)时很有用,因为它减少了数据的稀疏性。例如主题/摘要模型。
到目前为止我有什么。首先,我推导出一个相似性矩阵(基于一对叶子在树中有多少个共同节点 - 或者更准确地说,就是Wu& Palmer Wordnet距离度量),然后使用{{1}执行围绕medoids(pam)的分离R中的包。在示例数据中,k = 3..5个集群就可以了:如果小于3,没有公共根的叶子将被推入同一个集群。这没有任何意义,因为它们没有任何共同之处。这大部分都有效。但是,对于较大的数据集(500多个这样的项),即使我选择了适当的高k,这有时也会发生 - 不应该聚集的东西会被聚集。现在我的解决方案是打印一个警告,指示(通过检查所有群集的公共根节点),并选择不同的k。
我需要的是一种“告诉”/监督聚类算法的方法,我不希望某些项目聚集在一起(这本身很容易 - 例如,在计算(dis)相似度矩阵时,我可以使用相同尺寸的平行矩阵,并且当遇到一对项目没有共同的根时,那里会有一个标记指示该事实)。但是,我一直在使用的pam函数似乎不允许使用这样的约束。目前,没有共同根的项目被赋予0相似性(在转换为相异度矩阵时,将是存在的最大距离)。我尝试在矩阵中增加这些对的距离值,但后来我意识到将这些项目进一步拉开会使其他项目“更接近”聚类算法,再次扭曲结果。
谷歌搜索后我得出的结论是,我要么自己实现它(我没有找到开箱即用的R包)或者我一直在寻找错误的关键词,因为我的知识有限机器学习。所以对于我的问题(如何让它在R中工作?)任何一个答案都会有所帮助 - 要么建议一个R包来做它,要么建议一种方法来实现它(一些例子R代码将有助于我开始) 。或者也许我一直都认为这一切都错了,k-medoids聚类在这里不是正确的解决方案?
小更新:我发现包cluster
确实似乎做了类似的事情,函数flexclust
有一个参数kcca
应该是实现一个can-link约束 - 但是文档没有更多地说明它(引用的paper也没有)。此外,groupFun = "differentClusters"
采用常规数据矩阵作为输入,而我所拥有的是距离矩阵(我通过计算每对单词的Wu& Palmer距离度量,逐个单元构建,基于上面数据示例中描述的叶到根路径。所以我想这不是解决方案。