2

我正在使用 WEKA 来训练分类 Java 程序。最初有几个类别,比如说 10 个,系统必须处理这些初始类别并开始训练。为了做到这一点......:

String [] categories = {"cat1", "cat2", ..., "cat10"};

public SomeClassifier(String[] categories) {

// Creates a FastVector of attributes.
FastVector attributes = new FastVector(3);

// Add attribute for holding property one.
attributes.addElement(new Attribute(P1_ATTRIBUTE, (FastVector) null));

// Add attribute for holding property two.
attributes.addElement(new Attribute(P2_ATTRIBUTE, (FastVector) null));

// Add values attribute.
FastVector values = new FastVector(categories.length);
for (int i = 0; i < categories.length; i++) {
    values.addElement(categories[i]);
}

attributes.addElement(new Attribute(CATEGORY_ATTRIBUTE, values));

// Create dataset with initial capacity of 25, and set index
Instances myInstances = new Instances(SOME_NAME, attributes, 25);
myInstances.setClassIndex(myInstances.numAttributes() - 1);
}

好的,现在,时间过去了,我想在我的训练集中添加一个新类别(比如说“cat11”),它已经在训练中取得了一些成功。我怎样才能做到这一点?WEKA 文档说“一旦创建了属性,就无法更改”。所以,也许我可以从 Instances 对象中取出 Attribute,重新创建 Attribute,然后再次插入它......或者这会搞砸一切吗?

提前致谢。

4

1 回答 1

0

好的,显然,没有办法使用这种朴素贝叶斯实现来做这样的事情。这是因为在初始化分类器时,附加到分类器的所有类别的总和必须为 1,而在训练分类器时,概率 != 0 的新类别将导致分类器以总和 > 1 的奇怪方式运行。 ,分类器可能会根据类别数量的影响来初始化其算法(计算条件概率和迭代),并且在创建后添加一个新的将意味着以某种方式重建算法。

所以,这就留下了一个问题……我可以使用什么分类机制来让我随着时间的推移引入新的类别?

于 2012-08-21T08:37:05.087 回答