`
txf2004
  • 浏览: 7039939 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://dreamhead.blogbus.com/logs/16813833.html

Weka,是一个用Java编写的数据挖掘软件。数据挖掘,从字面上来看,它是一个从数据中找寻有用信息的过程,不过,它涉及的内容很多,所以,这里借用“分类”这一面来说事。

分类,从名称上来看,再简单不过了,给你一样东西,给它分个类。你如何知道怎么分类呢?显然,这是基于你已有的经验。对于计算机而言,这种经验从何而来呢?只有让人来告诉它,也就是说,我们要拿一批数据训练计算机,经过训练的计算机,便具备了一定的识别能力,就可以完成一些简单的分类工作。现实中,可以用到分类的机会有很多,比如我之前,曾经参与过的一个项目就是用这种方法来做车辆的识别。

下面便是一段使用Weka完成一段分类程序。

import weka.classifiers.Classifier;
import weka.classifiers.bayes.NaiveBayesMultinomial;
import weka.core.Attribute;
import weka.core.FastVector;
import weka.core.Instance;
import weka.core.Instances;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.StringToWordVector;

public class Main {
private static final String GOOD = "G";
private static final String BAD = "B";

private static final String CATEGORY = "category";
private static final String TEXT = "text";

private static final int INIT_CAPACITY = 100;

private static final String[][] TRAINING_DATA = {
{"Good", GOOD},
{"Wonderful", GOOD},
{"Cool", GOOD},
{"Bad", BAD},
{"Disaster", BAD},
{"Terrible", BAD}
};

private static final String TEST_DATA = "Good";

private static Filter filter = new StringToWordVector();
private static Classifier classifier = new NaiveBayesMultinomial();

public static void main(String[] args) throws Exception {
FastVector categories = new FastVector();
categories.addElement(GOOD);
categories.addElement(BAD);

FastVector attributes = new FastVector();
attributes.addElement(new Attribute(TEXT, (FastVector)null));
attributes.addElement(new Attribute(CATEGORY, categories));

Instances instances = new Instances("Weka", attributes, INIT_CAPACITY);
instances.setClassIndex(instances.numAttributes() - 1);

for (String[] pair : TRAINING_DATA) {
String text = pair[0];
String category = pair[1];

Instance instance = createInstanceByText(instances, text);
instance.setClassValue(category);
instances.add(instance);
}

filter.setInputFormat(instances);
Instances filteredInstances = Filter.useFilter(instances, filter);
classifier.buildClassifier(filteredInstances);

// Test
String testText = TEST_DATA;
Instance testInstance = createTestInstance(instances.stringFreeStructure(), testText);

double predicted = classifier.classifyInstance(testInstance);
String category = instances.classAttribute().value((int)predicted);
System.out.println(category);
}

private static Instance createInstanceByText(Instances data, String text) {
Attribute textAtt = data.attribute(TEXT);
int index = textAtt.addStringValue(text);

Instance instance = new Instance(2);
instance.setValue(textAtt, index);
instance.setDataset(data);

return instance;
}

private static Instance createTestInstance(Instances data, String text) throws Exception {
Instance testInstance = createInstanceByText(data, text);
filter.input(testInstance);
return filter.output();
}
}

这个程序分成两个大部分,前半部分用以训练分类器,后半部分则是测试这个分类器。

训练分类器,我们要做的包括,选择分类算法和准备训练数据。在Weka中,每一种分类算法都是Classifier的一个子类,这样的话,就可以在不改变其它部分的情况下,很容易的修改分类算法。

其实,稍微了解一下这方面的知识的人,都会知道,分类算法固然重要,但真正决定一个分类器本事大小的,是用以训练的数据。想要得到一个好的分类器,少不了不断调整训练数据和不断的训练。这同人类认识问题是一样的,经得多,见得广,才有更好的分辨能力。

在Weka中,用以训练的数据就是Instances,顾名思义,这是Instance的复数,显而易见,单独的一个训练数据就是Instance,而Instances这个类的存在,可以把Instance的一些公共的属性放到一起。在这里,我们可以看到,为了用文本作为训练数据,我们会把文本转换为Instance。同样,测试分类器的时候,我们也会把文本转换为一个Instance,然后再进行分类。

除此之外,这里还有一个Filter的概念,同常见的filter概念类似,它给了我们一个进行正式处理之前,对数据进行处理的机会。在这里,主要是对Instance做一些相关的变换。

当我们得到一个分类器之后,就可以利用这个分类器进行分类了,其中,最关键的代码是
classifier.classifyInstance(testInstance);
这段代码返回的是根据分类算法计算结果得到的一个相似度,我们可以利用这个值来估计我们测试用的数据应该属于哪个分类。

从代码上来说,这段代码本身并不复杂。正如前面所说,一个好的分类器是需要让数据帮忙的。所以,换几个测试数据,你就会发现,这段代码中实现的分类器一点都不强大。如果希望它强大起来,扩展训练数据是一个必然的结果。不过,对于这篇blog而言,这不重要,因为我们只是要和Weka问个好,进一步的工作,还需要进一步的努力。

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://dreamhead.blogbus.com/logs/16813833.html

Weka,是一个用Java编写的数据挖掘软件。数据挖掘,从字面上来看,它是一个从数据中找寻有用信息的过程,不过,它涉及的内容很多,所以,这里借用“分类”这一面来说事。

分类,从名称上来看,再简单不过了,给你一样东西,给它分个类。你如何知道怎么分类呢?显然,这是基于你已有的经验。对于计算机而言,这种经验从何而来呢?只有让人来告诉它,也就是说,我们要拿一批数据训练计算机,经过训练的计算机,便具备了一定的识别能力,就可以完成一些简单的分类工作。现实中,可以用到分类的机会有很多,比如我之前,曾经参与过的一个项目就是用这种方法来做车辆的识别。

下面便是一段使用Weka完成一段分类程序。

import weka.classifiers.Classifier;
import weka.classifiers.bayes.NaiveBayesMultinomial;
import weka.core.Attribute;
import weka.core.FastVector;
import weka.core.Instance;
import weka.core.Instances;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.StringToWordVector;

public class Main {
private static final String GOOD = "G";
private static final String BAD = "B";

private static final String CATEGORY = "category";
private static final String TEXT = "text";

private static final int INIT_CAPACITY = 100;

private static final String[][] TRAINING_DATA = {
{"Good", GOOD},
{"Wonderful", GOOD},
{"Cool", GOOD},
{"Bad", BAD},
{"Disaster", BAD},
{"Terrible", BAD}
};

private static final String TEST_DATA = "Good";

private static Filter filter = new StringToWordVector();
private static Classifier classifier = new NaiveBayesMultinomial();

public static void main(String[] args) throws Exception {
FastVector categories = new FastVector();
categories.addElement(GOOD);
categories.addElement(BAD);

FastVector attributes = new FastVector();
attributes.addElement(new Attribute(TEXT, (FastVector)null));
attributes.addElement(new Attribute(CATEGORY, categories));

Instances instances = new Instances("Weka", attributes, INIT_CAPACITY);
instances.setClassIndex(instances.numAttributes() - 1);

for (String[] pair : TRAINING_DATA) {
String text = pair[0];
String category = pair[1];

Instance instance = createInstanceByText(instances, text);
instance.setClassValue(category);
instances.add(instance);
}

filter.setInputFormat(instances);
Instances filteredInstances = Filter.useFilter(instances, filter);
classifier.buildClassifier(filteredInstances);

// Test
String testText = TEST_DATA;
Instance testInstance = createTestInstance(instances.stringFreeStructure(), testText);

double predicted = classifier.classifyInstance(testInstance);
String category = instances.classAttribute().value((int)predicted);
System.out.println(category);
}

private static Instance createInstanceByText(Instances data, String text) {
Attribute textAtt = data.attribute(TEXT);
int index = textAtt.addStringValue(text);

Instance instance = new Instance(2);
instance.setValue(textAtt, index);
instance.setDataset(data);

return instance;
}

private static Instance createTestInstance(Instances data, String text) throws Exception {
Instance testInstance = createInstanceByText(data, text);
filter.input(testInstance);
return filter.output();
}
}

这个程序分成两个大部分,前半部分用以训练分类器,后半部分则是测试这个分类器。

训练分类器,我们要做的包括,选择分类算法和准备训练数据。在Weka中,每一种分类算法都是Classifier的一个子类,这样的话,就可以在不改变其它部分的情况下,很容易的修改分类算法。

其实,稍微了解一下这方面的知识的人,都会知道,分类算法固然重要,但真正决定一个分类器本事大小的,是用以训练的数据。想要得到一个好的分类器,少不了不断调整训练数据和不断的训练。这同人类认识问题是一样的,经得多,见得广,才有更好的分辨能力。

在Weka中,用以训练的数据就是Instances,顾名思义,这是Instance的复数,显而易见,单独的一个训练数据就是Instance,而Instances这个类的存在,可以把Instance的一些公共的属性放到一起。在这里,我们可以看到,为了用文本作为训练数据,我们会把文本转换为Instance。同样,测试分类器的时候,我们也会把文本转换为一个Instance,然后再进行分类。

除此之外,这里还有一个Filter的概念,同常见的filter概念类似,它给了我们一个进行正式处理之前,对数据进行处理的机会。在这里,主要是对Instance做一些相关的变换。

当我们得到一个分类器之后,就可以利用这个分类器进行分类了,其中,最关键的代码是
classifier.classifyInstance(testInstance);
这段代码返回的是根据分类算法计算结果得到的一个相似度,我们可以利用这个值来估计我们测试用的数据应该属于哪个分类。

从代码上来说,这段代码本身并不复杂。正如前面所说,一个好的分类器是需要让数据帮忙的。所以,换几个测试数据,你就会发现,这段代码中实现的分类器一点都不强大。如果希望它强大起来,扩展训练数据是一个必然的结果。不过,对于这篇blog而言,这不重要,因为我们只是要和Weka问个好,进一步的工作,还需要进一步的努力。

分享到:
评论

相关推荐

    Weka 中文版 v0.3 发布 基于weka 3.7.12 x64

    在第2版weka中文版的 基础上制作了第3版,暂定版本v0.3。将 guichooser 汉化完成。考虑到大家还是习惯使用 guichooser 作为默认启动界面,将 RunWeka.ini 中的设置恢复默认。但是为了支持中文,其中的编码选项从 cp...

    weka-src[weka源码]

    在Weka的源码中,`META-INF`可能包含了Weka的版本信息、签名信息以及其他元数据,这对于了解Weka的构建和打包过程是很有帮助的。 2. **weka**: 这个目录包含了Weka的核心代码。我们可以在这个目录下找到各种数据...

    weka开发java版jar包和源码

    这样,就可以直接使用Weka提供的类和方法,例如`weka.classifiers.Classifier`类用于训练和预测模型,`weka.core.Instances`类用于处理数据集,`weka.filters.Filter`类则用于数据预处理。 例如,以下是一个简单的...

    weka_doc(weka文档)

    Weka(Waikato Environment for Knowledge Analysis)是一个强大的数据挖掘和机器学习工具,主要用于数据分析和预测建模。这个系统由新西兰怀卡托大学的计算机科学系开发,是完全开源的,采用Java语言编写,因此具备...

    weka.jar和weka.zip源码 API

    Weka,全称为“Waikato Environment for Knowledge Analysis”,是一个广泛应用于数据挖掘和机器学习领域的开源软件工具。这个工具集提供了丰富的算法库,包括分类、回归、聚类、关联规则和特征选择等,并且支持数据...

    weka源码学习

    Weka 开发[1]-Instances类 1 Weka开发[2]-分类器类 2 Weka开发[3]-Evaluation类 3 Weka开发[4]-特征选择 4 Weka开发[5]-半监督算法 6 Weka开发[0]-导入Weka包 8 半监督算法工具SVMlin使用 12 半...

    Java实现对Weka算法的应用案例

    在IT领域,Weka是一个非常著名的数据挖掘工具,它提供了丰富的机器学习算法库。这个案例主要探讨了如何在Java环境中利用Weka进行数据分析和建模。以下是对标题和描述中涉及知识点的详细解释: 1. **Weka算法**:...

    WEKA中文教程

    WEKA中文教程WEKA中文教程WEKA中文教程WEKA中文教程WEKA中文教程WEKA中文教程

    WEKA完整中文教程 实验教程 入门教程

    **WEKA全称是Waikato Environment for Knowledge Analysis,它是一个强大的数据挖掘工具,由新西兰怀卡托大学开发。这个工具主要用于机器学习和数据挖掘领域的实验与分析,提供了丰富的算法库,涵盖了预处理、分类、...

    weka使用中文教程

    WEKA 使用中文教程 WEKA(Waikato Environment for Knowledge Analysis)是一种开放的数据挖掘工作平台,能够承担大量数据挖掘任务,包括数据预处理、分类、回归、聚类、关联规则等。_WEKA 的主要开发者来自新西兰...

    weka java 开发软件

    "weka.jar"是Weka的核心库,包含了所有预定义的数据挖掘算法和工具,开发者可以直接在Java代码中引用这个库,调用Weka的功能。而"weka_src.jar"则包含了Weka的源代码,这对于开发者来说非常宝贵,因为可以查看并理解...

    weka数据挖掘软件相关文档

    weka资料\1 有没有weka相关的qq群.doc ........\assignment1.pdf ........\BayesianNetClassifiers.pdf ........\ExperimenterTutorial-3.5.3.pdf ........\ExperimenterTutorial.pdf ........\ExplorerGuide-...

    weka-3.7.3.jar- java开发包

    Weka 是一个强大的数据挖掘和机器学习工具,主要用于教学、研究和工业应用。这个压缩包包含的是 Weka 3.7.3 版本的 Java 开发包,它允许开发者在自己的 Java 应用程序中直接集成和调用 Weka 的功能。 1. **Weka ...

    weka jar包

    **Weka详解** Weka(Waikato Environment for Knowledge Analysis)是一个开源的机器学习软件,由新西兰怀卡托大学开发,主要用于数据挖掘和数据分析。它提供了丰富的机器学习算法、数据预处理工具以及可视化功能,...

    weka源代码分析

    【Weka源代码分析】 Weka,全称为Waikato Environment for Knowledge Analysis,是由新西兰怀卡托大学开发的一款强大的机器学习和数据挖掘工具。这款开源软件不仅提供了多种预处理、分类、回归、聚类和关联规则算法...

    weka的JAVA程序

    Weka 是一个强大的数据挖掘和机器学习工具,它源自新西兰的怀卡托大学。这个压缩包文件包含的是基于 Java 编写的 Weka 程序,意味着你可以通过编写 Java 代码来利用 Weka 的功能进行数据分析和建模。Weka 提供了丰富...

    weka 中em算法详细解析

    标题:“Weka中EM算法详细解析” 描述:“深入解析Weka中的EM算法,内容详尽,值得学习。” 根据给定的文件信息,我们将探讨Weka中EM算法的关键知识点,包括其在Weka框架中的实现、EM算法的工作原理、以及算法在...

    weka_android.zip

    标题 "weka_android.zip" 暗示了这个压缩包包含了一个特别为Android平台优化的Weka版本。Weka是一个广泛使用的开源数据挖掘和机器学习工具集,通常在Java环境中运行,提供图形用户界面(GUI)和编程接口。在Android...

Global site tag (gtag.js) - Google Analytics