DNA序列的聚类与判别
生活随笔
收集整理的這篇文章主要介紹了
DNA序列的聚类与判别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
已知給定的前20個DNA序列,1-10為A類,11-20為B類,從中提取特征,構造分類方法,并用這些已知類別的序列,衡量方法是否足夠好。然后用該方法對另外20 個未標明類別的人工序列(標號21—40)進行分類。
參考了網上一篇文章的做法,利用模糊聚類分析的方法,先將64個密碼子的分布率作為前20個序列的特征分別提取出來,再利用夾角余弦法建立模糊相似矩陣,進而得到模糊等價矩陣,接著利用不同的閾值確定截矩陣,通過分析后得到確定的分類。
重復代碼比較多,望見諒~
package cn.gao;import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List;import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test;public class DNATest {static List<double[]> list = new ArrayList<double[]>(); //將40個序列的密碼子信息保存到該list中double[][] matrix1 = new double[20][20]; //用來保存模糊相似矩陣double[][] matrix2 = new double[20][20]; //用來保存模糊等價矩陣double[][] matrix0 = new double[20][20]; //模糊相似矩陣的副本int[][] matrix3 = new int[20][20]; //用來保存截矩陣@BeforeClasspublic static void run(){/*String s1 = "aggcacggaaaaacgggaataacggaggaggacttggcacggcattacacggaggacgaggtaaaggaggcttgtctacggccggaagtgaagggggatatgaccgcttgg";String s2 = "cggaggacaaacgggatggcggtattggaggtggcggactgttcggggaattattcggtttaaacgggacaaggaaggcggctggaacaaccggacggtggcagcaaagga";String s3 = "gggacggatacggattctggccacggacggaaaggaggacacggcggacatacacggcggcaacggacggaacggaggaaggagggcggcaatcggtacggaggcggcgga";String s4 = "atggataacggaaacaaaccagacaaacttcggtagaaatacagaagcttagatgcatatgttttttaaataaaatttgtattattatggtatcataaaaaaaggttgcga";String s5 = "cggctggcggacaacggactggcggattccaaaaacggaggaggcggacggaggctacaccaccgtttcggcggaaaggcggagggctggcaggaggctcattacggggag";String s6 = "atggaaaattttcggaaaggcggcaggcaggaggcaaaggcggaaaggaaggaaacggcggatatttcggaagtggatattaggagggcggaataaaggaacggcggcaca";String s7 = "atgggattattgaatggcggaggaagatccggaataaaatatggcggaaagaacttgttttcggaaatggaaaaaggactaggaatcggcggcaggaaggatatggaggcg";String s8 = "atggccgatcggcttaggctggaaggaacaaataggcggaattaaggaaggcgttctcgcttttcgacaaggaggcggaccataggaggcggattaggaacggttatgagg";String s9 = "atggcggaaaaaggaaatgtttggcatcggcgggctccggcaactggaggttcggccatggaggcgaaaatcgtgggcggcggcagcgctggccggagtttgaggagcgcg";String s10 = "tggccgcggaggggcccgtcgggcgcggatttctacaagggcttcctgttaaggaggtggcatccaggcgtcgcacgctcggcgcggcaggaggcacgcgggaaaaaacg";String s11 = "gttagatttaacgttttttatggaatttatggaattataaatttaaaaatttatattttttaggtaagtaatccaacgtttttattactttttaaaattaaatatttatt";String s12 = "gtttaattactttatcatttaatttaggttttaattttaaatttaatttaggtaagatgaatttggttttttttaaggtagttatttaattatcgttaaggaaagttaaa";String s13 = "gtattacaggcagaccttatttaggttattattattatttggattttttttttttttttttttaagttaaccgaattattttctttaaagacgttacttaatgtcaatgc";String s14 = "gttagtcttttttagattaaattattagattatgcagtttttttacataagaaaatttttttttcggagttcatattctaatctgtctttattaaatcttagagatatta";String s15 = "gtattatatttttttatttttattattttagaatataatttgaggtatgtgtttaaaaaaaatttttttttttttttttttttttttttttttaaaatttataaatttaa";String s16 = "gttatttttaaatttaattttaattttaaaatacaaaatttttactttctaaaattggtctctggatcgataatgtaaacttattgaatctatagaattacattattgat";String s17 = "gtatgtctatttcacggaagaatgcaccactatatgatttgaaattatctatggctaaaaaccctcagtaaaatcaatccctaaacccttaaaaaacggcggcctatccc";String s18 = "gttaattatttattccttacgggcaattaattatttattacggttttatttacaattttttttttttgtcctatagagaaattacttacaaaacgttattttacatactt";String s19 = "gttacattatttattattatccgttatcgataattttttacctcttttttcgctgagtttttattcttactttttttcttctttatataggatctcatttaatatcttaa";String s20 = "gtatttaactctctttactttttttttcactctctacattttcatcttctaaaactgtttgatttaaacttttgtttctttaaggattttttttacttatcctctgttat";*///這里是給定的前20個序列String s1 = "tttagctcagtccagctagctagtttacaatttcgacaccagtttcgcaccatcttaaatttcgatccgtaccgtaatttagcttagatttggatttaaaggatttagattga";String s2 = "tttagtacagtagctcagtccaagaacgatgtttaccgtaacgtqacgtaccgtacgctaccgttaccggattccggaaagccgattaaggaccgatcgaaaggg";String s3 = "cgggcggatttaggccgacggggacccgggattcgggacccgaggaaattcccggattaaggtttagcttcccgggatttagggcccggatggctgggaccc";String s4 = "tttagctagctactttagctatttttagtagctagccagcctttaaggctagctttagctagcattgttctttattgggacccaagttcgacttttacgatttagttttgaccgt";String s5 = "gaccaaaggtgggctttagggacccgatgctttagtcgcagctggaccagttccccagggtattaggcaaaagctgacgggcaattgcaatttaggcttaggcca";String s6 = "gatttactttagcatttttagctgacgttagcaagcattagctttagccaatttcgcatttgccagtttcgcagctcagttttaacgcgggatctttagcttcaagctttttac";String s7 = "ggattcggatttacccggggattggcggaacgggacctttaggtcgggacccattaggagtaaatgccaaaggacgctggtttagccagtccgttaaggcttag";String s8 = "tccttagatttcagttactatatttgacttacagtctttgagatttcccttacgattttgacttaaaatttagacgttagggcttatcagttatggattaatttagcttattttcga";String s9 = "ggccaattccggtaggaaggtgatggcccgggggttcccgggaggatttaggctgacgggccggccatttcggtttagggagggccgggacgcgttagggc";String s10 = "cgctaagcagctcaagctcagtcagtcacgtttgccaagtcagtaatttgccaaagttaaccgttagctgacgctgaacgctaaacagtattagctgatgactcgta";String s11 = "ttaaggacttaggctttagcagttactttagtttagttccaagctacgtttacgggaccagatgctagctagcaatttattatccgtattaggcttaccgtaggtttagcgt";String s12 = "gctaccgggcagtctttaacgtagctaccgtttagtttgggcccagccttgcggtgtttcggattaaattcgttgtcagtcgctctrtgggtttagtcattcccaaaagg";String s13 = "cagttagctgaatcgtttagccatttgacgtaaacatgattttacgtacgtaaattttagccctgacgtttagctaggaatttatgctgacgtagcgatcgactttagcac";String s14 = "cggttagggcaaaggttggatttcgacccagggggaaagcccgggacccgaacccagggctttagcgtaggctgacgctaggcttaggttggaacccggaaa";String s15 = "gcggaagggcgtaggtttgggatgcttagccgtaggctagctttcgacacgatcgattcgcaccacaggataaaagttaagggaccggtaagtcgcggtagcc";String s16 = "ctagctacgaacgctttaggcgcccccgggagtagtcgttaccgttagtatagcagtcgcagtcgcaattcgcaaaagtccccagctttagccccagagtcgacg";String s17 = "gggatgctgacgctggttagctttaggcttagcgtagctttagggccccagtctgcaggaaatgcccaaaggaggcccaccgggtagatgccasagtgcaccgt";String s18 = "aacttttagggcatttccagttttacgggttattttcccagttaaactttgcaccattttacgtgttacgatttacgtataatttgaccttattttggacactttagtttgggttac";String s19 = "ttagggccaagtcccgaggcaaggaattctgatccaagtccaatcacgtacagtccaagtcaccgtttgcagctaccgtttaccgtacgttgcaagtcaaatccat";String s20 = "ccattagggtttatttacctgtttattttttcccgagaccttaggtttaccgtactttttaacggtttacctttgaaatttttggactagcttaccctggatttaacggccagttt";//這里是后20個待判別的序列classify(s1);classify(s2);classify(s3);classify(s4);classify(s5);classify(s6);classify(s7);classify(s8);classify(s9);classify(s10);classify(s11);classify(s12);classify(s13);classify(s14);classify(s15);classify(s16);classify(s17);classify(s18);classify(s19);classify(s20);}//得到模糊相似矩陣,保存到matrix1二維數組中,并打印到txt文件@Beforepublic void matrix1() throws IOException{//將模糊相似矩陣輸出到txt文件FileOutputStream out = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\模糊相似矩陣.txt");//規定輸出的格式為保留小數點后3位DecimalFormat df = new DecimalFormat("0.000");for(int i = 0;i<20;i++){for(int j = 0;j<20;j++){matrix1[i][j] = fenzi(i,j)/fenmu(i,j);matrix0[i][j] = matrix1[i][j]; //模糊相似矩陣的副本}}out.write("模糊相似矩陣:\r\n".getBytes());for(int a = 0;a<20;a++){for(int b = 0;b<a+1;b++){//System.out.print(df.format(matrix1[a][b])+" ");out.write((df.format(matrix1[a][b])+" ").getBytes());}//System.out.println();out.write("\r\n".getBytes());}out.close();}//夾角余弦法的分子public double fenzi(int i,int j){double s = 0;for(int k = 0;k<64;k++){s = s+(list.get(i))[k]*(list.get(j))[k];}return s;}//夾角余弦法的分母public double fenmu(int i,int j){double s1 = 0;double s2 = 0;for(int k = 0;k<64;k++){s1 = s1+(list.get(i))[k]*(list.get(i))[k];s2 = s2+(list.get(j))[k]*(list.get(j))[k];}double s = Math.sqrt(s1)*Math.sqrt(s2);return s;}//對模糊相似矩陣進行多次平方得到模糊等價矩陣,并根據閾值得到截矩陣@Testpublic void matrix2() throws IOException{DecimalFormat df = new DecimalFormat("0.000");FileOutputStream out = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\模糊等價矩陣.txt");for(int n = 0;n<16;n++){R2();}out.write("模糊等價矩陣:\r\n".getBytes());for(int a = 0;a<20;a++){for(int b = 0;b<a+1;b++){//System.out.print(df.format(matrix1[a][b])+" ");out.write((df.format(matrix1[a][b])+" ").getBytes());}//System.out.println();out.write("\r\n".getBytes());}//得到截矩陣//設置閾值double lamda = 0.65;for(int i = 0;i<20;i++){for(int j = 0;j<20;j++){if(matrix1[i][j] >= lamda){matrix3[i][j] = 1;}else{matrix3[i][j] = 0;}}}FileOutputStream out2 = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\截矩陣.txt");out2.write("截矩陣:\r\n".getBytes());out2.write(("閾值為:"+lamda+"\r\n").getBytes());for(int a = 0;a<20;a++){for(int b = 0;b<a+1;b++){System.out.print(matrix3[a][b]+" ");out2.write((matrix3[a][b]+" ").getBytes());}System.out.println();out2.write("\r\n".getBytes());}out.close();out2.close();}//對模糊矩陣進行一次平方public void R2(){//DecimalFormat df = new DecimalFormat("0.000");for(int i = 0;i<20;i++){for(int j = 0;j<20;j++){matrix2[i][j] = multiply2(i,j);}}//matrix1 = matrix2;for(int a = 0;a<20;a++){for(int b = 0;b<20;b++){matrix1[a][b] = matrix2[a][b];}}/*for(int a = 0;a<20;a++){for(int b = 0;b<a+1;b++){System.out.print(df.format(matrix2[a][b])+" ");}System.out.println();}*/}//前一個矩陣行與后一個矩陣列的合成public double multiply2(int i,int j){ //i為前一個矩陣的行數,j為后一個矩陣的列數double res = 0;for(int a = 0;a<20;a++){if(matrix1[i][a]>=matrix1[a][j]){if(matrix1[a][j]>res){res = matrix1[a][j];}}if(matrix1[i][a]<matrix1[a][j]){if(matrix1[i][a]>res){res = matrix1[i][a];}}}return res;}//判斷密碼子的類別public static void classify(String s){double[] x = new double[64];for(int i = 0;i<s.length()-2;i++){if(s.charAt(i)=='a'){ //第一個位置的判斷 aif(s.charAt(i+1)=='a'){ //第二個位置的判斷 aif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[0]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[1]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[2]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[3]++;}}if(s.charAt(i+1)=='t'){ //第二個位置的判斷 tif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[4]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[5]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[6]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[7]++;}}if(s.charAt(i+1)=='c'){ //第二個位置的判斷 cif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[8]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[9]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[10]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[11]++;}}if(s.charAt(i+1)=='g'){ //第二個位置的判斷 gif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[12]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[13]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[14]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[15]++;}}}if(s.charAt(i)=='t'){ //第一個位置的判斷 tif(s.charAt(i+1)=='a'){ //第二個位置的判斷 aif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[16]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[17]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[18]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[19]++;}}if(s.charAt(i+1)=='t'){ //第二個位置的判斷 tif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[20]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[21]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[22]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[23]++;}}if(s.charAt(i+1)=='c'){ //第二個位置的判斷 cif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[24]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[25]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[26]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[27]++;}}if(s.charAt(i+1)=='g'){ //第二個位置的判斷 gif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[28]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[29]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[30]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[31]++;}}}if(s.charAt(i)=='c'){ //第一個位置的判斷 cif(s.charAt(i+1)=='a'){ //第二個位置的判斷 aif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[32]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[33]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[34]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[35]++;}}if(s.charAt(i+1)=='t'){ //第二個位置的判斷 tif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[36]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[37]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[38]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[39]++;}}if(s.charAt(i+1)=='c'){ //第二個位置的判斷 cif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[40]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[41]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[42]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[43]++;}}if(s.charAt(i+1)=='g'){ //第二個位置的判斷 gif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[44]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[45]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[46]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[47]++;}}}if(s.charAt(i)=='g'){ //第一個位置的判斷 aif(s.charAt(i+1)=='a'){ //第二個位置的判斷 aif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[48]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[49]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[50]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[51]++;}}if(s.charAt(i+1)=='t'){ //第二個位置的判斷 tif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[52]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[53]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[54]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[55]++;}}if(s.charAt(i+1)=='c'){ //第二個位置的判斷 cif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[56]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[57]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[58]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[59]++;}}if(s.charAt(i+1)=='g'){ //第二個位置的判斷 gif(s.charAt(i+2)=='a'){ //第三個位置的判斷x[60]++;}if(s.charAt(i+2)=='t'){ //第三個位置的判斷x[61]++;}if(s.charAt(i+2)=='c'){ //第三個位置的判斷x[62]++;}if(s.charAt(i+2)=='g'){ //第三個位置的判斷x[63]++;}}}}for(int j = 0;j<64;j++){/*DecimalFormat df = new DecimalFormat("#.0000"); //設置為4位小數x[j] = Double.parseDouble(df.format(x[j]/(s.length()-2))); */x[j] = x[j]/(s.length()-2);//System.out.println(x[j]);}list.add(x);} }總結
以上是生活随笔為你收集整理的DNA序列的聚类与判别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 某华为外包功能测试花四个月时间学习自动化
- 下一篇: 变频器服务器维修培训,1、服务器培训.d