使用WEKA将音乐分类为流派

daw*_*awg 5 java machine-learning nearest-neighbor weka

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

我目前生成的是从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";
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 0

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

步骤是:

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

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