java - 使用 weka api 进行聚类

标签 java weka

我通过使用 java + weka lib 开始使用开源代码集群我的数据 当数据集的格式为 .arff 时它可以正确运行,但我想使用 movielens 的数据集(使用用户的人口统计信息对用户进行聚类) 文件名为“u.user” 你可以在这里找到文件说明 http://files.grouplens.org/datasets/movielens/ml-100k-README.txt

这是我的代码

import weka.clusterers.SimpleKMeans;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;
import java.io.IOException;
public class Clustering {
    public static void main(String args[]) throws Exception{
        //load dataset
        String dataset = "C:/Users/DELL/Desktop/work/u.user";
        DataSource source = new DataSource(dataset);
        //get instances object
        Instances data = source.getDataSet();
        // new instance of clusterer
        SimpleKMeans model = new SimpleKMeans();//Simple EM (expectation maximisation)
        //number of clusters
        model.setNumClusters(4);
        //set distance function
        //model.setDistanceFunction(new weka.core.ManhattanDistance());
        // build the clusterer
        model.buildClusterer(data);
        System.out.println(model);

}
}

运行后显示此错误

Exception in thread "main" java.io.IOException: File not found : C:\Users\DELL\Desktop\work\u.names
    weka.core.converters.C45Loader.setSource(C45Loader.java:190)
    weka.core.converters.AbstractFileLoader.setFile(AbstractFileLoader.java:90)
    weka.core.converters.ConverterUtils$DataSource.reset(ConverterUtils.java:306)
    weka.core.converters.ConverterUtils$DataSource.<init>(ConverterUtils.java:141)
    Clustering.main(Clustering.java:24)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:498)
    com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

    at weka.core.converters.C45Loader.setSource(C45Loader.java:190)
    at weka.core.converters.AbstractFileLoader.setFile(AbstractFileLoader.java:90)
    at weka.core.converters.ConverterUtils$DataSource.reset(ConverterUtils.java:306)
    at weka.core.converters.ConverterUtils$DataSource.<init>(ConverterUtils.java:141)
    at Clustering.main(Clustering.java:24)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

Process finished with exit code 1

我确信这是因为文件的扩展名,因为当我使用带有扩展名的其他文件时。arff 它可以工作 你能帮我如何聚类我的数据

最佳答案

您还需要注意文件格式(不仅仅是扩展名)。转换数据集格式以匹配 Weka ARFF format 。如果您的数据为 u.user,则需要将扩展​​名更改为 *.arff(例如 user.arff),并将格式更改为如下所示:

@RELATION user

@ATTRIBUTE id   INTEGER  % this is actually useless
@ATTRIBUTE age  INTEGER
@ATTRIBUTE gender   {M,F}
@ATTRIBUTE occupation   {administrator,artist,doctor,educator,engineer,entertainment,executive,healthcare,homemaker,lawyer,librarian,marketing,none,other,programmer,retired,salesman,scientist,student,technician,writer}  % from u.occupation
@ATTRIBUTE zipcode  STRING

@DATA
1,24,M,technician,85711
2,53,F,other,94043
3,23,M,writer,32067
4,24,M,technician,43537
5,33,F,other,15213
6,42,M,executive,98101
7,57,M,administrator,91344
8,36,M,administrator,05201
...

您应该能够将数据集解析为 weka.core.Instances。但不幸的是,SimpleKMeans 将拒绝您的数据:

weka.core.UnsupportedAttributeTypeException: weka.clusterers.SimpleKMeans: Cannot handle string attributes!

所以你有(至少)3 个选择:

  1. 对数据特征进行矢量化或将其转换为数值(同时删除 id 等无用数据)
  2. 使用另一种可以处理分类值的聚类算法,例如 weka.clusterers.HierarchicalClusterer
  3. 合并两个解决方案

祝你好运!

关于java - 使用 weka api 进行聚类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42597777/

相关文章:

java - 如何跳过数组中的空格字母,为什么我的修复不起作用?

java - ImageIO 不支持的图像类型 - 修复后的 TwelveMonkeys 插件无法正常工作?

当您不是文件所有者时,Java File.setLastModified() 在 Linux 上失败

java - JxTaskPane 之外的 Swing 选项

java - 实例中没有一类的 ARFF

java - "Exception in thread "主要 "java.lang.NullPointerException"- CSV 到 Arff

java - 如何让用户注册后看到自己的数据?

java - 使用 Weka 进行错误的类别预测

java - 为什么 Weka GUI 输出与 Java 代码不同?

database - 添加数据库驱动程序以使用 WEKA 类