【问题标题】:Weka always producing same clusters for different dataWeka 总是为不同的数据生成相同的集群
【发布时间】:2015-01-03 16:33:37
【问题描述】:

我正在尝试使用 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,还是遗漏了一些重要的东西?

【问题讨论】:

  • Weka 通常会自动规范化您的数据,从而破坏权重。试试 ELKI。
  • 虽然 Weka 确实为我规范了数据,但我没有时间废弃所有代码并使用另一个框架重新启动。正如下面的答案所说,告诉 Weka 不要正常化会更有意义。

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


【解决方案1】:

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

我对一个随机数据集进行了测试,然后对其中一个属性数据进行了第二次试验,结果这两个集群是相同的。将该值设置为 true 会导致不同的集群,从而导致数据集中实例的分配。

希望对您有所帮助!

【讨论】:

  • 谢谢!请注意,我的程序默认使用 EuclideanDistance,并且仅在命令行选项指定时才使用曼哈顿,但 Euclidean 具有相同的 dontNormalize 选项,因此该解决方案仍然有效。
  • 我已更新我的答案以更好地反映情况。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
相关资源
最近更新 更多