Mic*_*nte 5 java cluster-analysis data-mining weka 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
Run Code Online (Sandbox Code Playgroud)
"修饰符"数组的第一个维度对应于每个属性,并且每个属性内有两个值.从属性值中减去第一个,然后将结果除以第二个值.
规范化如下:
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]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的期望是增加第二次归一化应该降低特定属性对群集的重要性,从而改变群集的分配方式,但这不是我所观察到的.我的调试器显示正确规范化的值被发送到群集器中,但我发现很难相信Weka正在搞乱而不是我.
我是否正确使用过Weka的K-Means,还是我遗漏了一些重要的东西?
NormalizedDistance距离测量(例如欧几里得和曼哈顿)有一个名为dontNormalize的选项,它可以自动为您标准化值。默认情况下,将启用此功能,这可能会撤消标准化函数调用中完成的所有工作。
我对随机数据集进行了测试,然后操作其中一个属性数据进行第二次试验,两个集群最终是相同的。将值设置为 true 会导致不同的集群,从而导致数据集中实例的分配。
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
652 次 |
| 最近记录: |