我尝试使用WEKA(GUI和Java代码)执行模糊聚类。在我的数据集中,我有两个字段:id和string,所以我想通过这些字符串进行聚类,并作为输出获取每个字符串,具有属于每个集群的概率的数组。
我编写的代码定义了具有所有必需属性的过滤器(与WEKA GUI中的相同),然后使用EM进行集群,然后使用clusterer.distributionForInstance(filteredData ...)进行打印输出分发。它运行甚至打印输出,问题是每个条目分配1到一个集群,而对于其他集群,它分配0。 你是否善意协助并告诉我可能是什么问题?
我附上我的代码片段以获取进一步的建议:
Instances train = DataSource.read(args[0]);
Instances test = DataSource.read(args[1]);
StringToWordVector filter = new StringToWordVector();
filter.setTFTransform(true);
filter.setLowerCaseTokens(true);
filter.setAttributeIndices("last");
filter.setInputFormat(train);
filter.setStopwordsHandler(new Rainbow());
Instances filteredData = Filter.useFilter(train, filter);
Instances testFilteredData = Filter.useFilter(test, filter);
//build clusterer
EM clusterer = new EM();
clusterer.buildClusterer(filteredData);
for (int i = 0; i < testFilteredData.numInstances(); i++) {
double[] dist = clusterer.distributionForInstance(testFilteredData.instance(i));
System.out.print(testFilteredData.instance(i));
System.out.print(Utils.arrayToString(dist));
System.out.println();
}
如果不需要tiidf变换,该过程非常有效。 如果用分类替换聚类(显然必须添加类属性),它也可以很好地工作。
谢谢!