原文地址:https://blog.csdn.net/chekongfu/article/details/84231789
導讀:機器學習是目前盛行於世的技術之一,這幾年一時風頭無兩。雖然在機器學習中,Python是人工智能從業者使用最多的編程語言,但是,Java 在項目開發中仍然發揮着不可替代的作用,而且許多流行的機器學習框架本身就是 Java編寫的。Python 的資料到處都是,而 Java 相關的資料就相對少了很多。今天我們翻譯了 Fatema Patrawala> 撰寫的《六大最常用的 Java 機器學習庫一覽》。
在 MLOSS.org 網站上,列出了 70 多個基於 Java 的開源機器學習項目,可能還有更多未列出的項目,存於大學里的服務器、GitHub 或 Bitbucket 中。我們將在本文中回顧 Java 中的主流機器學習庫和平台,它們能夠解決的問題類型,支持的算法以及可以使用的數據類型。
本文節選自 Machine learning in Java,由 Bostjan Kaluza 編寫,Packt Publishing Ltd. 出版
Weka
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 可以讓你開發新的機器學習方案並在應用中使用這些算法。
Weka 是在 GNU 通用公共許可證(GNU GPL)下發布的,這意味着你可以復制、分發和修改它,只要你跟蹤源文件中的更改並將其保存在 GNU GPL 下。你甚至可以進行商業分發,但前提是你必須公開源代碼或獲得商業許可證。
除了幾種支持的文件格式外,Weka 還提供了自己的默認數據格式 ARFF,用於通過屬性 - 數據對描述數據。它由兩部分組成:第一部分包含標題頭,它指定所有屬性(即特性)及其類型;例如,標稱、數字、日期和字符串。第二部分包含數據,其中每行對應於一個實例。標題頭中的最后一個屬性隱式地被視為目標變量,缺失的數據用問號標記。例如,用 ARFF 文件格式編寫的 Bob 實例如下:
@RELATION person_dataset @ATTRIBUTE `Name` STRING @ATTRIBUTE `Height` NUMERIC @ATTRIBUTE `Eye color`{blue, brown, green} @ATTRIBUTE `Hobbies` STRING @DATA 'Bob', 185.0, blue, 'climbing, sky diving' 'Anna', 163.0, brown, 'reading' 'Jane', 168.0, ?, ?
該文件由三個部分組成。第一部分以 @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:這些是各種決策樹算法,包括 ID3、C4.5、M5、功能樹、邏輯樹、隨機森林等。
-
-
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.5、以及其他決策樹模型、多元邏輯回歸、朴素貝葉斯和 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)一書。
轉載自:https://hub.packtpub.com/most-commonly-used-java-machine-learning-libraries/#
下一步閱讀:
5 JavaScript machine learning libraries you need to know
A non programmer’s guide to learning Machine learning
Why use JavaScript for machine learning?
====================================================25個JAVA 機器學習工具包===============================================
原文地址:https://blog.csdn.net/zhangjianjaEE/article/details/78584956
本列表總結了25個Java機器學習工具&庫:
-
Weka集成了數據挖掘工作的機器學習算法。這些算法可以直接應用於一個數據集上或者你可以自己編寫代碼來調用。Weka包括一系列的工具,如數據預處理、分類、回歸、聚類、關聯規則以及可視化。
-
Massive Online Analysis(MOA)是一個面向數據流挖掘的流行開源框架,有着非常活躍的成長社區。它包括一系列的機器學習算法(分類、回歸、聚類、異常檢測、概念漂移檢測和推薦系統)和評估工具。關聯了WEKA項目,MOA也是用Java編寫的,其擴展性更強。
-
MEKA項目提供了一個面向多標簽學習和評價方法的開源實現。在多標簽分類中,我們要預測每個輸入實例的多個輸出變量。這與“普通”情況下只涉及一個單一目標變量的情形不同。此外,MEKA基於WEKA的機器學習工具包。
-
Advanced Data mining And Machine learning System(ADAMS)是一種新型的柔性工作流引擎,旨在迅速建立並保持真實世界的復雜知識流,它是基於GPLv3發行的。
-
Environment for Developing KDD-Applications Supported by Index-Structure(ELKI)是一款基於Java的開源(AGPLv3)數據挖掘軟件。ELKI主要集中於算法研究,重點研究聚類分析中的無監督方法和異常檢測。
-
Mallet是一個基於Java的面向文本文件的機器學習工具包。Mallet支持分類算法,如最大熵、朴素貝葉斯和決策樹分類。
-
Encog是一個先進的機器學習框架,集成了支持向量機(SVM)、人工神經網絡、遺傳算法、貝葉斯網絡、隱馬爾可夫模型(HMM)、遺傳編程和遺傳算法。
-
Datumbox機器學習框架是一個用Java編寫的開源框架,允許快速地開發機器學習和統計應用。該框架的核心重點包括大量的機器學習算法以及統計測試,能夠處理中等規模的數據集。
-
Deeplearning4j是使用Java和Scala編寫的第一個商業級的、開源的、分布式深入學習庫。其設計的目的是用於商業環境中,而不是作為一個研究工具。
-
Mahout是一個內置算法的機器學習框架。Mahout-Samsara幫助人們創建他們自己的數學,並提供了一些現成的算法實現。
-
Rapid Miner是德國多特蒙特技術大學開發的。它為開發者開發應用程序提供了一個GUI(圖形用戶界面)和Java API。它還提供了一些機器學習算法,用來做數據處理、可視化以及建模。
-
Apache SAMOA是一個機器學習(ML)框架,內嵌面向分布式流ML算法的編程抽象,並且允許在沒有直接處理底層分布式流處理引擎(DSPEe,如Apache Storm、Apache S4和Apache samza)復雜性的情況下,開發新的ML算法。用戶可以開發分布式流ML算法,而且可以在多個DSPEs上執行。
-
Neuroph通過提供支持創建、訓練和保存神經網絡的Java網絡庫和GUI工具,簡化了神經網絡開發。
-
Oryx 2是一個建立在Apache Spark和Apache Kafka的Lambda架構實現,但隨着實時大規模機器學習而逐漸開始專業化。這是一個用於構建應用程序的框架,但也包括打包,以及面向協同過濾、分類、回歸和聚類的端到端的應用程序。
-
Stanford Classifier是一個機器學習工具,它可以將數據項歸置到一個類別。一個概率分類器,比如這個,它可以對一個數據項給出類分配的概率分布。該軟件是最大熵分類器的一個Java實現。
-
io是一個Retina API,有着快速精確的類似大腦的自然語言處理算法。
-
JSAT是一個快速入門的機器學習庫。該庫是我在業余時間開發的,基於GPL3發行的。庫中的一部分內容可自主學習,例如所有的代碼都是獨立的。JSAT沒有外部依賴,而且是純Java編寫的。
-
N-Dimensional Arrays for Java(ND4J)是一個用於JVM的科學計算庫。它們是用來在生產環境中使用的,這表明例程的設計是以最小的內存需求來運行的。
-
Java Machine Learning Library(Java機器學習庫)是一系列機器學習算法的相關實現。這些算法,無論是源代碼還是文檔,都編寫的很出色。其主要語言是Java。
-
Java-ML是一個使用Java編寫的一系列機器學習算法的Java API。它只提供了一個標准的算法接口。
-
MLlib (Spark)是Apache Spark的可擴展機器學習庫。雖然是Java,但該庫與平台還支持Java,Scala和Python綁定。此庫是最新的,並且算法很多。
-
H2O是用於智能應用的機器學習API。它在大數據上對統計學、機器學習和數學進行了規模化。H2O可擴展,開發者可以在核心部分使用簡單的數學知識。
-
WalnutiQ是人腦部分面向對象模型,有着理論常用的學習算法(正在向簡單強烈的情感人工智能模型方向研究)。
-
RankLib是一個排名學習算法庫。目前已經實現八種流行的算法。
-
htm.java(基於Java的Hierarchical Temporal Memory算法實現)是一個面向智能計算的Numenta平台的Java接口。