Weka总是为不同的数据生成相同的集群

时间:2014-11-07 00:11:34

标签: java cluster-analysis weka data-mining k-means

我试图使用Weka对一组数据进行K-Means聚类,检查不同权重如何影响不同的属性。

但是,当我调整每个属性的权重时,我没有看到群集中的任何差异。

//Initialize file readers
...
Instances dataSet = readDataFile(dataReader);
double[][] modifiers = readNormalizationFile(normReader, dataSet.numAttributes());
normalize(dataSet, modifiers);
SimpleKMeans kMeans = new SimpleKMeans();
kMeans.setPreserveInstancesOrder(true);
int[] clusters = null;
try
{
    System.out.println(kMeans.getSeed());
    if(distMet != 0)
        kMeans.setDistanceFunction(new ManhattanDistance(dataSet));
    kMeans.setNumClusters(k);
    kMeans.buildClusterer(dataSet);

    clusters = kMeans.getAssignments();
}
//Print clusters

"修饰符的第一个维度"数组对应于每个属性,并且每个属性中有两个值。从属性值中减去第一个,然后将结果除以第二个值。

规范化是这样的:

public static void normalize(Instances dataSet, double[][] modifiers)
{
    for(int i = 0; i < dataSet.numInstances(); i++)
    {
        Instance currInst = dataSet.instance(i);
        double[] values = currInst.toDoubleArray();
        for(int j = 0; j < values.length; j++)
        {
            currInst.setValue(j, (values[j] - modifiers[j][0]) / modifiers[j][1]);
        }
    }
}

我的期望是,增加第二次归一化应该降低特定属性对群集的重要性,从而改变群集的分配方式,但这不是我观察到的。我的调试器显示正确规范化的值被发送到群集器中,但我发现很难相信Weka正在搞乱而不是我。

我是否正确使用过Weka的K-Means,还是遗漏了重要的东西?

1 个答案:

答案 0 :(得分:2)

NormalizableDistance距离测量(例如欧几里得和曼哈顿)有一个名为dontNormalize的选项,它可以自动为您标准化值。默认情况下,这将启用,这可能会撤消在规范化函数调用中完成的所有工作。

我为随机数据集运行了测试,然后为第二次试验操纵了一个属性数据,这两个集群最终完全相同。将值设置为true会导致不同的集群,从而分配数据集中的实例。

希望这有帮助!