liutomcat

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            1 隨筆 :: 0 文章 :: 1 評論 :: 0 Trackbacks

          Weka,是一個用Java編寫的數據挖掘軟件。數據挖掘,從字面上來看,它是一個從數據中找尋有用信息的過程,不過,它涉及的內容很多,所以,這里借用“分類”這一面來說事。

          分類,從名稱上來看,再簡單不過了,給你一樣東西,給它分個類。你如何知道怎么分類呢?顯然,這是基于你已有的經驗。對于計算機而言,這種經驗從何而來呢?只有讓人來告訴它,也就是說,我們要拿一批數據訓練計算機,經過訓練的計算機,便具備了一定的識別能力,就可以完成一些簡單的分類工作。現實中,可以用到分類的機會有很多,比如我之前,曾經參與過的一個項目就是用這種方法來做車輛的識別。

          下面便是一段使用Weka完成一段分類程序。

          import weka.classifiers.Classifier;
          import weka.classifiers.bayes.NaiveBayesMultinomial;
          import weka.core.Attribute;
          import weka.core.FastVector;
          import weka.core.Instance;
          import weka.core.Instances;
          import weka.filters.Filter;
          import weka.filters.unsupervised.attribute.StringToWordVector;

          public class Main {
            private static final String GOOD = "G";
            private static final String BAD = "B";
             
            private static final String CATEGORY = "category";
            private static final String TEXT = "text";
             
            private static final int INIT_CAPACITY = 100;
             
            private static final String[][] TRAINING_DATA = {
              {"Good", GOOD},
              {"Wonderful", GOOD},
              {"Cool", GOOD},
              {"Bad", BAD},
              {"Disaster", BAD},
              {"Terrible", BAD}
            };
             
            private static final String TEST_DATA = "Good";
             
            private static Filter filter = new StringToWordVector();
            private static Classifier classifier = new NaiveBayesMultinomial();
             
            public static void main(String[] args) throws Exception {
              FastVector categories = new FastVector();
              categories.addElement(GOOD);
              categories.addElement(BAD);

              FastVector attributes = new FastVector();
              attributes.addElement(new Attribute(TEXT, (FastVector)null));
              attributes.addElement(new Attribute(CATEGORY, categories));

              Instances instances = new Instances("Weka", attributes, INIT_CAPACITY);
              instances.setClassIndex(instances.numAttributes() - 1);
                 
              for (String[] pair : TRAINING_DATA) {
                String text = pair[0];
                String category = pair[1];

                Instance instance = createInstanceByText(instances, text);
                instance.setClassValue(category);
                instances.add(instance);
              }
                 
              filter.setInputFormat(instances);
              Instances filteredInstances = Filter.useFilter(instances, filter);
              classifier.buildClassifier(filteredInstances);

              // Test
              String testText = TEST_DATA;
              Instance testInstance = createTestInstance(instances.stringFreeStructure(), testText);

              double predicted = classifier.classifyInstance(testInstance);
              String category = instances.classAttribute().value((int)predicted);
              System.out.println(category);
            }
             
            private static Instance createInstanceByText(Instances data, String text) {
              Attribute textAtt = data.attribute(TEXT);
              int index = textAtt.addStringValue(text);

              Instance instance = new Instance(2);
              instance.setValue(textAtt, index);
              instance.setDataset(data);

              return instance;
            }
             
            private static Instance createTestInstance(Instances data, String text) throws Exception {
              Instance testInstance = createInstanceByText(data, text);
              filter.input(testInstance);
              return filter.output();
            }
          }

          這個程序分成兩個大部分,前半部分用以訓練分類器,后半部分則是測試這個分類器。

          訓練分類器,我們要做的包括,選擇分類算法和準備訓練數據。在Weka中,每一種分類算法都是Classifier的一個子類,這樣的話,就可以在不改變其它部分的情況下,很容易的修改分類算法。

          其實,稍微了解一下這方面的知識的人,都會知道,分類算法固然重要,但真正決定一個分類器本事大小的,是用以訓練的數據。想要得到一個好的分類器,少不了不斷調整訓練數據和不斷的訓練。這同人類認識問題是一樣的,經得多,見得廣,才有更好的分辨能力。

          在Weka中,用以訓練的數據就是Instances,顧名思義,這是Instance的復數,顯而易見,單獨的一個訓練數據就是Instance,而Instances這個類的存在,可以把Instance的一些公共的屬性放到一起。在這里,我們可以看到,為了用文本作為訓練數據,我們會把文本轉換為Instance。同樣,測試分類器的時候,我們也會把文本轉換為一個Instance,然后再進行分類。

          除此之外,這里還有一個Filter的概念,同常見的filter概念類似,它給了我們一個進行正式處理之前,對數據進行處理的機會。在這里,主要是對Instance做一些相關的變換。

          當我們得到一個分類器之后,就可以利用這個分類器進行分類了,其中,最關鍵的代碼是
              classifier.classifyInstance(testInstance);
          這段代碼返回的是根據分類算法計算結果得到的一個相似度,我們可以利用這個值來估計我們測試用的數據應該屬于哪個分類。

          從代碼上來說,這段代碼本身并不復雜。正如前面所說,一個好的分類器是需要讓數據幫忙的。所以,換幾個測試數據,你就會發現,這段代碼中實現的分類器一點都不強大。如果希望它強大起來,擴展訓練數據是一個必然的結果。不過,對于這篇blog而言,這不重要,因為我們只是要和Weka問個好,進一步的工作,還需要進一步的努力。

          posted on 2010-05-06 09:46 liutomcat 閱讀(1187) 評論(1)  編輯  收藏

          評論

          # re: Weka,是一個用Java編寫的數據挖掘軟件 2011-09-15 15:06 蒙蒙
          不錯,能用,正在研究  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 峨山| 咸丰县| 苏尼特左旗| 沈丘县| 东至县| 蒲城县| 德兴市| 德江县| 鹿泉市| 普兰店市| 绵竹市| 沙湾县| 深州市| 同江市| 泽州县| 桐城市| 水城县| 竹山县| 潼关县| 黑水县| 威海市| 遂昌县| 新疆| 肥西县| 孟连| 南召县| 临泽县| 珠海市| 逊克县| 天峻县| 宁德市| 时尚| 普安县| 全南县| 洞口县| 山阳县| 门头沟区| 莱州市| 漳州市| 蓬安县| 克什克腾旗|