我在玩 Java、Weka 和 IP 地址。现在我正在尝试使用数据集进行层次聚类:源和目标 IPv4(转换为十进制)和协议 - 均来自 Wireshark 日志。
我将地址和协议保存在列表中,并以手动方式构建数据集
FastVector atts = new FastVector();
atts.addElement(new Attribute("from"));
atts.addElement(new Attribute("to"));
atts.addElement(new Attribute("protocol", (FastVector)null));
Instances data = new Instances("Connections", atts, 0);
for (int i=0; i<50; i++) {
double[] vals = new double[data.numAttributes()];
// Get address from list and with special method convert it to long
vals[0] = from.get(i).getDecimal();
vals[1] = to.get(i).getDecimal();
// Protocol - String like "TCP"
vals[2] = data.attribute(2).addStringValue(protocol.get(i));
data.add(new Instance(1.0, vals));
}
HierarchicalClusterer hc = new HierarchicalClusterer();
//hc.setDebug(true);
hc.setPrintNewick(true);
hc.setNumClusters(4);
hc.buildClusterer(data);
System.out.print(hc);
当我从数据中打印一些随机实例时,我可以看到一切正常。但是在聚类的输出中只有关于协议的信息。例如(这只是一小部分)。
集群 1 ((MSNMS:0,MSNMS:0):0,MSNMS:0)
带有调试选项的输出类似于
合并 0 4 0.0 0.0
合并 0 5 0.0 0.0
合并 1 7 0.0 0.0
我做错了什么还是......像这样聚类数据集的整个想法只是愚蠢的?