使用WEKA将音乐分类为流派

时间:2013-12-15 04:01:59

标签: java machine-learning weka nearest-neighbor

我正在努力实现我对根据音乐文件的某些功能对音乐进行分类的调查的分类部分。

我目前生成的代码是从DB读取功能表,然后将其放回另一个表中的DB中。

问题是我不知道如何使用实例类型。文档是垃圾 - 我不知道该怎么做。

我想做什么:我想使用一组给定的音乐文件并计算它们的特征向量。在将这些数据放入arff后,我会手动将其与流派数据(即gial)连接。然后将其保存到MySQL表中。

AFAIU链应该是这样的:

  • 从DB读取

  • 以某种方式训练一个K近邻分类器,每个音乐文件的一组特征(与流派相关),为10个文件的主体。

  • 使用它来分类具有相同功能但未知类型的一组文件。

  • 以某种方式输出结果,以便它们在数据库中可以是机器可读的。

我没有找到实际用于进一步处理的数据输出的例子,所以我不能进一步讨价还价:/

完成此操作后,我想回读一下并对新的音乐主体进行分类(我通过音乐或使用样本文件集计算的功能)。应该将结果放回到另一个新表中的DB中,详细说明哪个文件具有哪个类别(已分配)。

这是我的代码:

package org.tuhh.cpmgg.weka;

import weka.core.*;
import weka.core.converters.*;
import weka.experiment.InstanceQuery;

import java.io.*;
import java.util.ArrayList;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType; 

@Path("/weka2")
public class weka_chain {

  /**
   * loads a dataset from mysql db
   * @param args the commandline arguments
   */
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String main() 
            throws Exception {

    java.util.List resultList;

    /*Gets data from DB*/

    InstanceQuery query = new InstanceQuery();
    query.setDatabaseURL("jdbc:mysql://127.2.73.130:3306/cpmgg");
    query.setUsername("adminnNWqHkW");
    query.setPassword("zLlkWsd-NsnQ");
    query.setQuery("SELECT * FROM features"); //Read table
    Instances data = query.retrieveInstances(); //into data
    data.setClassIndex(data.numAttributes() - 1); //sets the number of classes (creates index)

    /*Classifiers */

    String algorithm = "weka.classifiers.bayes.NaiveBayes"; // Sets the type of classifier (many available)

    resultList = new ArrayList();

    Weka1 weka; 
    try {
        weka = new Weka1(algorithm, "lol");
        resultList = weka.weka(algorithm, data); //Essentially what is happening



        /* TODO:
         * Define Output so that it is in table form/instance form
         * This means creating output using the old applet and somehow (?) distilling it into table shape
         */


    /* Saves Results to DB */

    DatabaseSaver save = new DatabaseSaver();
    // save.setUrl("jdbc:mysql://localhost:3306/weka_test");
    save.setUrl("jdbc:mysql://127.2.73.130:3306/cpmgg");
    //save.setUrl("jdbc:mysql://localhost:3306/hibernate");
    save.setUser("AMDINADMIN");
    save.setPassword("PASS_ PASS");
    save.setInstances(data); // define outputtype
    save.setRelationForTableName(false);
    save.setTableName("weka_rslts");
    save.connectToDatabase();
    save.writeBatch();

    return "done";
  }
}

1 个答案:

答案 0 :(得分:0)

有一个非常有趣的Weka教程,可以回答您的部分问题。

步骤是:

  1. 使用jAudio教程进行特征提取
  2. 将输出文件格式更改为ARFF
  3. 更改采样率以匹配音频文件
  4. 更改要素计算方案,然后将数据集加载到Weka上, 有机会使用分类器对每个曲目的类型进行分类。

查看以下链接:https://www.cs.cmu.edu/~music/cmsip/projects/p6.pdf