Tag: 集群分析

在Weka中使用StringToWordVector和内部数据结构

我正在尝试使用Weka获取文档聚类。 这个过程是一个更大的管道的一部分,我真的不能写出arff文件。 我将每个文档中的所有文档和单词包都作为Map<String, Multiset>结构,其中键是文档名称, Multiset值是文档中单词的包 。 我有两个问题,真的: (1)目前的方法最终聚集了术语,而不是文件: public final Instances buildDocumentInstances(TreeMap<String, Multiset> docToTermsMap, String encoding) throws IOException { int dimension = TermToDocumentFrequencyMap.navigableKeySet().size(); FastVector attributes = new FastVector(dimension); for (String s : TermToDocumentFrequencyMap.navigableKeySet()) attributes.addElement(new Attribute(s)); List instances = Lists.newArrayList(); for (Map.Entry<String, Multiset> entry : docToTermsMap.entrySet()) { Instance instance = new Instance(dimension); for (Multiset.Entry ms_entry : […]

k-means聚类算法的实现

在我的程序中,我将k = 2用于k均值算法,即我只想要2个聚类。 我以一种非常简单直接的方式实现,仍然无法理解为什么我的程序进入无限循环。 任何人都可以指导我在哪里犯错误..? 为简单起见,我已经在程序代码本身中获取了输入。 这是我的代码: import java.io.*; import java.lang.*; class Kmean { public static void main(String args[]) { int N=9; int arr[]={2,4,10,12,3,20,30,11,25}; // initial data int i,m1,m2,a,b,n=0; boolean flag=true; float sum1=0,sum2=0; a=arr[0];b=arr[1]; m1=a; m2=b; int cluster1[]=new int[9],cluster2[]=new int[9]; for(i=0;i<9;i++) System.out.print(arr[i]+ "\t"); System.out.println(); do { n++; int k=0,j=0; for(i=0;i<9;i++) { if(Math.abs(arr[i]-m1)<=Math.abs(arr[i]-m2)) { cluster1[k]=arr[i]; k++; […]

将float数组划分为类似的段(聚类)

我有一个像这样的浮点数组: [1.91, 2.87, 3.61, 10.91, 11.91, 12.82, 100.73, 100.71, 101.89, 200] 现在,我想像这样分区数组: [[1.91, 2.87, 3.61] , [10.91, 11.91, 12.82] , [100.73, 100.71, 101.89] , [200]] // [200]将被视为exception值,因为群集支持较少 我必须为几个数组找到这种段,我不知道分区大小应该是多少。 我试图通过使用层次聚类(Agglomerative)来做到这一点,它给我带来满意的结果。 然而,问题是,我被建议不要将聚类算法用于一维问题,因为它们没有理论上的理由(因为它们用于多维数据)。 我花了很多时间来寻找解决方案。 但是,建议看起来很不一样: 这个和这个 VS. 这和这个和这个 。 我发现了另一个建议,而不是聚类,即自然中断优化 。 但是,这也需要声明分区号,如K-means(右?)。 这很混乱(特别是因为我必须在几个arrays上执行这种分段,并且不可能知道最佳分区号)。 有什么方法可以找到分区(因此我们可以减少分区内的差异并最大化分区之间的差异),并提供一些理论上的理由吗? 任何指向文章/论文的指针(如果有可用的C / C ++ / Java实现)都有一些理论上的理由对我很有用。