6大最經常使用的Java機器學習庫一覽

在 MLOSS.org 網站上,列出了 70 多個基於 Java 的開源機器學習項目,可能還有更多未列出的項目,存於大學裏的服務器、GitHub 或 Bitbucket 中。咱們將在本文中回顧 Java 中的主流機器學習庫和平臺,它們可以解決的問題類型,支持的算法以及可使用的數據類型。java

本文節選自 Machine learning in Java,由 Bostjan Kaluza 編寫,Packt Publishing Ltd. 出版程序員

Wekaweb

Weka 是 Waikato Environment for Knowledge Analysis(Waikato 智能分析環境)的縮寫,是新西蘭 Waikato 大學開發的機器學習庫,也多是最爲有名的 Java 庫。Weka 是一個通用的庫,可以解決各類機器學習任務,如分類、迴歸和聚類。它具備豐富的圖形用戶界面、命令行界面和 Java API。有關 Weka 更多詳情,請參閱:http://www.cs.waikato.ac.nz/ml/weka/算法

截止到本書寫做之時,Weka 總共包含 267 個算法,其中:數據預處理(82),屬性選擇(33),分類和迴歸(133),聚類(12),關聯規則挖掘(7)。圖形界面很是適合用於探索數據,而 Java API 可讓你開發新的機器學習方案並在應用中使用這些算法。apache


圖片

Weka 是在 GNU 通用公共許可證(GNU GPL)下發布的,這意味着你能夠複製、分發和修改它,只要你跟蹤源文件中的更改並將其保存在 GNU GPL 下。你甚至能夠進行商業分發,但前提是你必須公開源代碼或得到商業許可證。數組

除了幾種支持的文件格式外,Weka 還提供了本身的默認數據格式 ARFF,用於經過屬性 - 數據對描述數據。它由兩部分組成:第一部分包含標題頭,它指定全部屬性(即特性)及其類型;例如,標稱、數字、日期和字符串。第二部分包含數據,其中每行對應於一個實例。標題頭中的最後一個屬性隱式地被視爲目標變量,缺失的數據用問號標記。例如,用 ARFF 文件格式編寫的 Bob 實例以下:緩存


該文件由三個部分組成。第一部分以 @relation 關鍵字開始,指定數據集名稱。下一部分以 @ATTRIBUTE 關鍵字開始,後面是屬性名和類型。可用的類型是 STRING(字符串)、NUMERIC(數字)、DATE(日期)和一組分類值。最後一個屬性被隱式假設爲咱們想要預測的目標變量。最後一部分以 @DATA 關鍵字開始,每行後面跟着一個實例。實例值用逗號分隔,而且必須遵循與第二部分中的屬性相同的順序。服務器

Weka 的 Java API 由如下的頂層包組成:網絡

  • weka.associations:這些是關聯規則學習的數據結構和算法,包括 Apriori、 predictive apriori、FilteredAssociator、FP-Growth、Generalized Sequential Patterns (GSP)、Hotspot 和 Tertius。數據結構

  • weka.classifiers:這些是監督學習算法、評估期和數據結構。該包由如下幾個部分組成:

    • weka.classifiers.bayes:它實現了貝葉斯(Bayesian)方法,包括樸素貝葉斯、貝式網絡、貝葉斯邏輯迴歸等。

    • weka.classifiers.evaluation:這些是評價統計、混淆矩陣、ROC 曲線等標稱和數值預測的監督評價算法。

    • weka.classifiers.functions:這些是迴歸算法,包括線性迴歸、保序迴歸、高斯過程、支持向量機、多層感知器、表決感知器等。

    • weka.classifiers.lazy:這些是基於實例的算法,好比 k- 最近鄰、K*,惰性貝葉斯規則。

    • weka.classifiers.meta:這些是監督學習元算法,包括 AdaBoost、bagging、加性迴歸、隨機委員會(random committee)等。

    • weka.classifiers.mi:這些是多實例算法,如 Citation-KNN、多樣性密度、MI AdaBoost 等。

    • weka.classifiers.rules:這些是基於變治法(separate-and-conquer)、Ripper、Part、Prism 的決策表和決策規格。

    • weka.classifiers.trees:這些是各類決策樹算法,包括 ID三、C4.五、M五、功能樹、邏輯樹、隨機森林等。

  • weka.clusterers:這些是聚類算法,包括 k-means、Clope、Cobweb、DBSCAN 層次聚類、Farthest 等

  • weka.core:這些是各類實用類、數據表示、配置文件等。

  • weka.datagenerators:這些是用於分類、迴歸和聚類算法的數據生成器。

  • weka.estimators:這些是用於離散 / 標稱域、條件機率估計等的各類數據分佈估計。

  • weka.experiment:這是一組類,支持運行實驗所需的配置、數據集、模型設置和統計信息。

  • weka.filters:這些是基於屬性和基於實例的選擇算法,用於監督和非監督數據預處理。

  • weka.gui:這些是實現 Explorer、Experimenter、和 Knowledge Flow 的圖形界面。Explorer 容許你調查數據集、算法及其參數,並使用散點圖和其餘可視化的形式對數據集進行可視化。Experimenter 用於設計批量實驗,但它只能用於分類和迴歸問題。Knowledge Flow 實現了可視化的拖放式用戶界面來構建數據流,如:加載數據、應用過濾器、構建分類器和評估。

用於機器學習的 Java-ML

Java 機器學習庫(Java-ML)是一組機器學習算法的集合,具有用於相同類型的算法的公共接口。它只提供 Java API,所以,它主要面向的是軟件工程師和程序員。Java-ML 包含用於數據預處理、特徵選擇、分類和聚類的算法。此外,它還提供了幾個 Weka 橋來直接經過 Java-ML API 訪問 Weka 的算法。Java-ML 可從 http://java-ml.sourceforge.net 下載,截至本書完成之際,最近版本發佈於 2012 年。


Java-ML 也是一個通用機器學習庫。與 Weka 相比,它提供了更爲一致的接口和最新算法的實現,在其餘包中不存在這些算法,如一系列最早進的類似性度量和特徵選擇技術等,這些包含動態時間規整、隨機森林屬性評估等等。Java-ML 也能夠在 GNU GPL 許可證下使用。

Java-ML 支持任何類型的文件,只要它每行包含一個數據樣本,而且特徵用逗號、分號和製表符分隔。

Java-ML 庫由如下頂層包組成:

  • net.sf.javaml.classification:這些是分類算法,包括樸素貝葉斯、隨機森林、Bagging、自組織映射、k- 最近鄰等。

  • net.sf.javaml.clustering:這些是聚類算法,包括 kmeans、自組織映射、空間聚類、Cobweb、AQBC 等。

  • net.sf.javaml.core:這些表示實例和數據集。

  • net.sf.javaml.distance:這些是測量實例距離和類似度的算法,如切比雪夫距離(Chebyshev distance)、餘弦距離 / 類似度、歐幾里得距離(Euclidian distance)、傑卡德距離(Jaccard distance)/ 類似度、馬氏距離(Mahalanobis distance)、曼哈頓距離(Manhattan distance)、明氏距離(Minkowski distance)、皮爾遜積矩相關係數(Pearson correlation coefficient)、斯皮爾曼簡捷距離(Spearman's footrule distance)、動態時間規整(dynamic time wrapping,DTW)等。

  • net.sf.javaml.featureselection:這些是用於特徵評估、評分、選擇和排名的算法,如增益比、ReliefF、Kullback-Liebler 散度、對稱不肯定性等。

  • net.sf.javaml.filter:這些是經過過濾、刪除屬性、設置類或屬性值等操做實例的方法。

  • net.sf.javaml.matrix:實現內存或基於文件的數組。

  • net.sf.javaml.sampling:實現選擇數據集子集的採樣算法。net.sf.javaml.tools:這些是關於數據集、實例操做、序列化、Weka API 接口等的使用方法。

  • net.sf.javaml.utils:這些是算法的實用方法,如統計、數學方法、列聯表等表等。

Apache Mahout

Apache Mahout 項目旨在構建可擴展的機器學習庫。它是在可擴展分佈式體系結構(如 Hadoop)上構建的,實用 MapReduce 範例,這是一種實用服務器集羣處理和生成具備並行分佈式算法的大型數據及的方法。


Mahout 提供了控制檯界面和 Java API,可用於聚類、分類和寫做過濾的可擴展算法。它能夠解決這三個業務問題:項目推薦,如向喜歡某部電影的人推薦其餘可能喜歡的電影;聚類,如將文本文檔分組與主題相關的文檔組中歸檔;分類,如學習將哪一個主題分配給未標記的文檔。

Mahout 是在商業化的 Apache 許可證下分發的,這意味着只要你保留 Apache 許可證並將其顯示在程序的版權聲明中,你就可使用它。

Mahout 提供瞭如下庫:

  • org.apache.mahout.cf.taste:這些是基於用戶和基於項目的協同過濾算法,及基於 ALS 的矩陣分解算法。

  • org.apache.mahout.classifier:這些是內存和分佈式實現,包括邏輯迴歸、樸素貝葉斯、隨機森林、隱馬爾科夫模型(hidden Markov models,HMM)和多層感知器。

  • org.apache.mahout.clustering:這些是聚類算法,例如 Canopy 聚類、k-means、模糊 k-means、流式 K-means 和譜聚類。

  • org.apache.mahout.common:這些是算法的實用方法,包括距離、MapReduce 操做、迭代器等。

  • org.apache.mahout.driver:實現了通用驅動程序來運行其餘類的主要方法。

  • org.apache.mahout.ep:這是使用記錄步驟突變的進化優化。

  • org.apache.mahout.math:這些是 Hadoop 中的各類數據額實用方法和實現。

  • org.apache.mahout.vectorizer:這些是用於數據表示、操做和 MapReduce 任務的類。

Apache Spark

Apache Spark(或簡稱 Spark)是在 Hadoop 上構建大規模數據處理的平臺,但與 Mahout 不一樣的是,它與 MapReduce 範式無關。相反,它使用內存緩存提取工做數據集,對其進行處理並重複查詢。據報道,Spark 直接處理磁盤存儲數據的速度是 Mahout 實現的十倍。可從 https://spark.apache.org 下載。


圖片

在 Spark 之上構建了許多模塊,例如用於圖形處理的 GraphX、用於處理實時數據流的 Spark Streaming 和用於機器學習庫的 MLlib,這些模塊具備分類、迴歸、協同過濾、聚類、降維和優化。

Spark 的 MLlib 可使用基於 Hadoop 的數據源,例如 Hadoop 分佈式文件系統(HDFS)或 HBase,以及本地文件。支持的數據類型包括如下幾種:

  • 局部向量存儲在一臺機器上。稠密向量表示爲雙類型值數組,如 (2.0,0.0,10.,0.0);而稀疏向量由向量的大小、索引數組和值數組表示,如 [4, (0, 2), (2.0, 1.0)]。

  • 標記點用於監督學習算法,由局部向量組成,用雙類型的類值標記。標籤能夠是類索引、二進制結果或多個類索引的列表(多類分類)。例如,標記的稠密向量表示爲 [1.0, (2.0, 0.0, 1.0, 0.0)]。

  • 局部矩陣在單臺機器上存儲稠密矩陣。它由矩陣維數和以列主序排列的單個雙數組定義。

  • 分佈式矩陣對存儲在 Spark 的彈性分佈式數據集(Resilient Distributed Dataset,RDD)中的數據進行操做,RDD 表示能夠並行操做的元素集合。有三種表示:行矩陣,其中每一行都是能夠存儲在一臺機器上的局部向量,但行索引沒有意義;索引行矩陣,相似於行矩陣,但行索引是有意義的,便可以識別行並執行行鏈接;座標矩陣,當行不能存儲在一臺機器上,且矩陣很是稀疏時才使用。

Spark 的 MLlib API 庫提供了各類學習算法和實用工具的接口,以下所示:


  • org.apache.spark.mllib.classification:這些是二元和多類分類算法,包括線性 SVM、邏輯迴歸、決策樹和樸素貝葉斯。

  • org.apache.spark.mllib.clustering:這些是 k-means 聚類。

  • org.apache.spark.mllib.linalg:這些是數據表示,包括稠密向量、稀疏向量和矩陣。

  • org.apache.spark.mllib.optimization:這是 MLlib 中做爲低級基元的各類優化算法,包括梯度降低、隨機梯度降低、分佈式 SGD 的更新方案和有限內存 BFGS。

  • org.apache.spark.mllib.recommendation:這些是基於模型的協同過濾,經過交替最小二乘矩陣分解來實現。

  • org.apache.spark.mllib.regression:這些是迴歸學習算法,如線性最小二乘、決策樹、Lasso 和 Ridge 迴歸。

  • org.apache.spark.mllib.stat:這些是稀疏或稠密向量格式的樣本的統計函數,用於計算均值、方差、最小值、最大值、計數和非零計數。org.apache.spark.mllib.tree:實現了分類和迴歸決策樹的算法。

  • org.apache.spark.mllib.util:這些是用於加載、保存、預處理、生成和驗證數據的方法的集合。

    Deeplearning4j

DeepLearning4j(或稱 DL4J),是一個用 Java 編寫的深度學習庫。它具備分佈式和單機深度學習框架,包括並支持各類神經網絡結構,如前饋神經網絡、RBM(Restricted Boltzmann Machine,受限玻爾茲曼機)、卷積神經網絡、深度信念網絡、自動編碼器等。DL4J 能夠解決不一樣的問題,好比識別面孔、聲音、垃圾郵件和電子商務欺詐。

Deeplearning4j 也是在 Apache 2.0 許可下分發的,可從 http://deeplearning4j.org 下載。該庫由如下組成:

  • org.deeplearning4j.base:這些是加載類。

  • org.deeplearning4j.berkeley:這些是數學使用方法。

  • org.deeplearning4j.clustering:k-means 的聚類實現。

  • org.deeplearning4j.datasets:這是數據集的操做,包括導入、建立、迭代等。

  • org.deeplearning4j.distributions:這是用於分發的實用方法。

  • org.deeplearning4j.eval:這些是評估類,包括混淆矩陣。

  • org.deeplearning4j.exceptions:實現異常處理程序。

  • org.deeplearning4j.models:這些是監督學習算法,包括深度信念網絡、堆疊式自動編碼器、堆疊去噪式自動編碼器和 RBM。

  • org.deeplearning4j.nn:這些是基於神經網絡的組件和算法的實現,例如神經網絡、多層網絡、卷積多層網絡等。

  • org.deeplearning4j.optimize:這些是神經網絡優化算法,包括反向傳播、多層優化、輸出層優化等。

  • org.deeplearning4j.plot:這些是用於呈現數據的各類方法。

  • org.deeplearning4j.rng:這是一個隨機數據生成器。

  • org.deeplearning4j.util:這些是幫助和實用方法。

    MALLET

機器學習語言工做包(Machine Learning for Language Toolkit,MALLET),是一個包含天然語言處理算法和實用程序的大型庫。它能夠用於各類任務,如文檔分類、分檔聚類、信息提取和主題建模。MALLET 提供了命令行界面和 Java API,適用於多種算法,如樸素貝葉斯、HMM(Hidden Markov Model,隱馬爾可夫模型)、隱含狄利克主題模型(Latent Dirichlet topic model)、邏輯迴歸和條件隨機域(conditional random fields)。


圖片


MALLET 能夠在通用公共許可證 1.0 下使用,這意味着你甚至能夠在商業應用程序中使用它。能夠從http://mallet.cs.umass.edu 下載。MALLET 實例由名稱、標籤、數據和源表示。可是,有兩種方法能夠將數據導入到 MALLET 格式中,以下所示:

  • Instance per file:每一個文件(即文檔)對應一個實例,MALLET 接受輸入的目錄名。

  • Instance per line:每行對應一個實例,假設使用如下格式:instance_name 標籤令牌。數據將是一個特徵向量,由做爲標記出現的不一樣單詞和它們出現次數組成。

該庫由如下包組成:

  • cc.mallet.classify:這些是用於訓練和分類實例的算法,包括 AdaBoost、Bagging、C4.五、以及其餘決策樹模型、多元邏輯迴歸、樸素貝葉斯和 Winnow2。

  • cc.mallet.cluster:這些是無監督聚類算法,包括貪心凝聚( greedy agglomerative)、登山算法(hill climbing)、k-best 和 k-means 聚類。

  • cc.mallet.extract:實現分詞器(tokenizers)、文檔提取器、文檔查看器和清理器等。

  • cc.mallet.fst: 實現了序列模型,包括條件隨機域、HMM、最大熵馬爾科夫模型(maximum entropy Markov models),以及相應的算法和評估器。

  • cc.mallet.grmm:實現瞭如推理算法、學習和測試的圖形模型和因子圖。例如環狀信念傳播(loopy belief propagation)、吉布斯採樣(Gibbs sampling)等。

  • cc.mallet.optimize:這些是用於尋找函數最大值的優化算法,例如梯度上升、有限內存 BFGS、隨機元上升(stochastic meta ascent)等。

  • cc.mallet.pipe:這些方法是將數據處理爲 MALLET 實例中的管道。cc.mallet.topics:這些是主題建模算法,例如隱含狄利克分佈(Latent Dirichlet allocation)、四級彈球分佈(four-level pachinko allocation)、分層 PAM、DMRT 等。

  • cc.mallet.types:實現了基本數據類型,如數據集、特徵向量、實例和標籤。

  • cc.mallet.util:這些是各類實用工具功能,如命令行處理、搜索、數學、測試等。

若是你想利用關鍵的 Java 機器學習庫進行設計、構建和部署你本身的機器學習應用,請查閱 Packt Publishing 出版社出版的《Java 機器學習》(Machine Learning in Java)一書。

相關文章
相關標籤/搜索