机器学习和生物信息学实验室联盟

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3999|回复: 9
打印 上一主题 下一主题

MRMD降维+weka验证+寻找最优分类

[复制链接]
跳转到指定楼层
楼主
发表于 2015-10-10 10:11:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. 背景
MRMD是一种对蛋白质序列特征向量降维的方法。但是在实际的蛋白质分类工作中,难以确定究竟在哪个维度下能够得到最精确的分类结果。因此,在魏乐义师兄工作基础上对测试维度程序进行了删改,谢师兄支持。首先借助MRMD对训练集进行降维,再通过这个降维信息对测试集降维,最后调用weka的Liblinear分类器对降维后的训练集、测试集进行分类。如果需要集成其他分类器,可以自行增加类。
Github托管地址:https://github.com/ShixiangWan/MRMD
2. 运行环境:Java JDK1.7
3. 使用方法
        3.1 将附件解压缩后直接导入Eclipse或Myeclipse,右键项目Buildpath添加项目文件夹lib中的所有jar包,不应有任何报错;
        3.2 修改主文件MRMDFeatureSelection.java中的下面三个字段并运行主程序:
       
  1.                 // arff训练集文件名称
  2.                 String TrainfeaName = "TrainSeq_DD_473D_Features";
  3.                 // arff测试集文件名称
  4.                 String TestfeaName = "TestSeq_DD_473D_Features";
  5.                 // arff文件所在路径
  6.                 String dir = "C:\\ShixiangWan\\workspace\\MRMD\\arff_data\\";
复制代码

4. 特别提示
        4.1 程序处理的所有文件都放在dir路径下,处理的临时文件末尾有“_temp”字样,保存最佳分类结果的文件末尾有“_best”字样;
        4.2 默认从10维特征开始,以2的倍数寻找能够得到最佳分类结果的维数。当维数翻倍增加的情况下,分类精确度没有提升,那么将会以10递减维数,回溯寻找匹配最佳精确度的最低维数,直到低于最佳精确度为止。如果你的待降维特征低于10维,请修改如下字段:
  1.                 int initNum = 10; // 特征选择初始值
  2.                 int gap = 2; //特征选择间隔
复制代码

        4.3 运行结果示例
  1. 当前特征维数:10
  2. 本次分类准确度:38.1201%, ↑
  3. 当前特征维数:20
  4. 本次分类准确度:52.7415%, ↑
  5. 当前特征维数:40
  6. 本次分类准确度:58.4856%, ↑
  7. 当前特征维数:80
  8. 本次分类准确度:58.7467%, ↑
  9. 当前特征维数:160
  10. 本次分类准确度:58.7467%, =
  11. 当前特征维数:150
  12. 本次分类准确度:58.7467%, =
  13. 当前特征维数:140
  14. 本次分类准确度:58.7467%, =
  15. 当前特征维数:130
  16. 本次分类准确度:58.7467%, =
  17. 当前特征维数:120
  18. 本次分类准确度:58.7467%, =
  19. 当前特征维数:110
  20. 本次分类准确度:58.7467%, =
  21. 当前特征维数:100
  22. 本次分类准确度:58.7467%, =
  23. 当前特征维数:90
  24. 本次分类准确度:58.7467%, =
  25. 当前特征维数:80
  26. 本次分类准确度:58.7467%, =
  27. 当前特征维数:70
  28. 本次分类准确度:58.7467%, =
  29. 当前特征维数:60
  30. 本次分类准确度:58.7467%, =
  31. 当前特征维数:50
  32. 本次分类准确度:57.9634%, ↓

  33. 最佳分类准确度:58.7467%
  34. 最佳特征维数:80
复制代码

        4.4 如果大家有什么建议可以直接留言,谢谢大家。邮箱:shixiangwan@foxmail.com
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享
回复

使用道具 举报

沙发
发表于 2015-10-10 12:57:08 | 只看该作者
赞!如果可以的话,一起打进一个jar里面,以后的同学使用的时候,就可以直接用个命令行调用等结果了。
回复 支持 反对

使用道具 举报

板凳
发表于 2015-10-10 13:30:07 | 只看该作者
动手能力很强啊,会用github!所以,这事实上是一个线性空间搜索方法,寻找最优参数。
回复 支持 反对

使用道具 举报

地板
发表于 2015-10-10 13:31:39 | 只看该作者
xmubingo 发表于 2015-10-10 13:30
动手能力很强啊,会用github!所以,这事实上是一个线性空间搜索方法,寻找最优参数。

哈哈,青出于蓝吧
回复 支持 反对

使用道具 举报

5#
发表于 2015-10-10 13:32:55 | 只看该作者
zouquan 发表于 2015-10-10 13:31
哈哈,青出于蓝吧

胜于蓝啊!@shixiang 助力,不怕没paper!
回复 支持 反对

使用道具 举报

6#
 楼主| 发表于 2015-10-10 14:23:52 | 只看该作者
谢谢大家支持哈。

再奉献一串小代码,将一个包含正例和反例的大文件分拆成两个特定实例数量的train.arff和test.arff:
  1. /*
  2. * 说明:对于某些正反例文件过大的情形,程序容易处理故障,本代码实现将大文件整合成正例和反例数目相等的文件,
  3. *                 同时保留剩余的实例,并删除错误分类的实例。
  4. * 作者:万世想
  5. * 时间:2015-10-05
  6. * */
  7. package demo02;

  8. import java.io.BufferedReader;
  9. import java.io.BufferedWriter;
  10. import java.io.FileReader;
  11. import java.io.FileWriter;
  12. import java.util.Random;

  13. public class FormatArff {
  14.         public static void main(String[] args) {
  15.                 String input_file_name = "pseb20_uniprot-cytokine70_all.arff"; //输入文件名
  16.                 int num = 8000; //待选取的正例和反例的数目,如果此值大于文件中的正例或反例,将按照最小的值进行选取
  17.                 String m_pos = "0"; //正例标记
  18.                 String m_neg = "1"; //反例标记
  19.                
  20.                 String br_line1, br_line2, end;
  21.                 int pos = 0, neg = 0, error = 0;
  22.                 try {
  23.                         //Please input the fasta file.
  24.                         BufferedReader br = new BufferedReader(new FileReader(input_file_name));
  25.                         BufferedReader br_main = new BufferedReader(new FileReader(input_file_name));
  26.                         BufferedWriter bw_main = new BufferedWriter(new FileWriter("main.arff", true));
  27.                         BufferedWriter bw_re = new BufferedWriter(new FileWriter("remain.arff", true));

  28.                         //1. Count the number of pos, neg and error.
  29.                         while (br.ready()) {
  30.                                 br_line1 = br.readLine();
  31.                                 if (br_line1 != null && br_line1.substring(0, 1).matches("[0-9]")) {
  32.                                         end = br_line1.substring(br_line1.lastIndexOf(",") + 1, br_line1.length());
  33.                                         if (end.equals(m_pos))
  34.                                                 pos++;
  35.                                         else if (end.equals(m_neg))
  36.                                                 neg++;
  37.                                         else
  38.                                                 error++;
  39.                                 }
  40.                         }
  41.                         System.out.println("POS: " + pos);
  42.                         System.out.println("NEG: " + neg);
  43.                         System.out.println("ERROR: " + error);
  44.                        
  45.                        
  46.                         //2. Get the minus number of instances.
  47.                         int minNum = Math.min(Math.min(pos, neg), num);
  48.                        
  49.                         //3. Choose random instance of pos and neg.
  50.                         Random random = new Random();
  51.                        
  52.                         boolean r_pos[] = new boolean[pos];
  53.                         for (int i = 0; i < minNum;) {
  54.                                 int temp = random.nextInt(pos);
  55.                                 if (!r_pos[temp]) {
  56.                                         r_pos[temp] = true;
  57.                                         i++;
  58.                                 }
  59.                         }
  60.                        
  61.                         boolean r_neg[] = new boolean[neg];
  62.                         for (int i = 0; i < minNum;) {
  63.                                 int temp = random.nextInt(neg);
  64.                                 if (!r_neg[temp]) {
  65.                                         r_neg[temp] = true;
  66.                                         i++;
  67.                                 }
  68.                         }
  69.                         //4. Integrate the pos and neg.
  70.                         int i = 0, j = 0;
  71.                         while (br_main.ready()) {
  72.                                 br_line2 = br_main.readLine();

  73.                                 if (br_line2 != null) {
  74.                                         if (!br_line2.substring(0, 1).matches("[0-9]")) {
  75.                                                 bw_main.write(br_line2 + "\n");
  76.                                                 bw_re.write(br_line2 + "\n");
  77.                                         } else {
  78.                                                 end = br_line2.substring(br_line2.lastIndexOf(",") + 1, br_line2.length());
  79.                                                 if (end.equals(m_pos)) {
  80.                                                         if (r_pos[i] && i < pos) {
  81.                                                                 bw_main.write(br_line2 + "\n");
  82.                                                         } else {
  83.                                                                 bw_re.write(br_line2 + "\n");
  84.                                                         }
  85.                                                         i++;
  86.                                                 }
  87.                                                 if (end.equals(m_neg)) {
  88.                                                         if (r_neg[j] && j < neg) {
  89.                                                                 bw_main.write(br_line2 + "\n");
  90.                                                         } else {
  91.                                                                 bw_re.write(br_line2 + "\n");
  92.                                                         }
  93.                                                         j++;
  94.                                                 }
  95.                                         }
  96.                                 }
  97.                         }
  98.                        
  99.                         br.close();
  100.                         br_main.close();
  101.                         bw_main.close();
  102.                         bw_re.close();
  103.                         System.out.println("OK!");

  104.                 } catch (Exception e) {
  105.                         System.out.println("ERROR");
  106.                 }
  107.         }
  108. }
复制代码
回复 支持 反对

使用道具 举报

7#
 楼主| 发表于 2015-10-10 14:28:13 | 只看该作者
zouquan 发表于 2015-10-10 12:57
赞!如果可以的话,一起打进一个jar里面,以后的同学使用的时候,就可以直接用个命令行调用等结果了。

嗯嗯,这样就更好了,我再集成几个分类器,打成jar包。
回复 支持 反对

使用道具 举报

8#
发表于 2015-10-10 14:42:59 | 只看该作者
shixiang 发表于 2015-10-10 14:28
嗯嗯,这样就更好了,我再集成几个分类器,打成jar包。

还应该考虑一下时间开销,如果大的话,可以多线程;
回复 支持 反对

使用道具 举报

9#
发表于 2015-10-13 20:57:33 | 只看该作者
xmubingo 发表于 2015-10-10 13:30
动手能力很强啊,会用github!所以,这事实上是一个线性空间搜索方法,寻找最优参数。

我觉得应该教会大家用git oschina或者github
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

机器学习和生物信息学实验室联盟  

GMT+8, 2024-4-26 04:57 , Processed in 0.069545 second(s), 17 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表