基于大數據的機器學習:Apache SystemML 在 IBM BigInsights 的實踐
機器學習是讓計算機從數據中學習的科學和藝術。換句話說,可以訓練計算機來了解數據科學家創建的模型。該計算機將使用算法從其接收的數據中迭代學習,并發現該數據中的模式。當新數據進入時,計算機可以根據以前學習的模式進行預測。例如,像亞馬遜和 Netflix 這樣的公司利用機器學習算法來分析客戶的歷史產品購買數據或他們觀看過的電影。亞馬遜然后可以向您推薦新產品,Netfix 可以推薦您可能感興趣的電影。另外一個例子,通過收集社交媒體情緒數據,零售商可以更多地了解客戶的購買習慣,從而提供更令人滿意的購物體驗。還比如,隨著搜索引擎收集越來越多的搜索和選擇數據,引擎可以提取與其用戶相關的更準確的信息,然后提供更相關的搜索結果,其原理是通過大量分析數據可以讓您看到通常可能看不到的內容,從而更好地為客戶服務。
ML 是機器學習 Machine Learning 的縮寫,所以 SystemML 顯而易見是機器學習系統,由 IBM 的 Almaden 實驗室 10 年前開發。它用 Java 語言編寫,可支持描述性分析、分類、聚類、回歸、矩陣分解及生存分析等機器學習算法。IBM 人工智能 Waston 平臺就整合了 SystemML 的功能,例如 SystemML 用于 Watson 醫療用于預測治療結果的機器學習算法,精確度大幅度提高。
SystemML 在 2015 年由 IBM 開源,于 2015 年 8 月 27 日在 GitHub 上公開發布,并于 2015 年 11 月 2 日成為 Apache Incubator 孵化項目。Apache SystemML 作為開源大數據機學習平臺受到廣泛認可,在 Cadent Technology 和 IBM Watson Health 等客戶實踐中備受贊譽。Apache Software Foundation 在 2017 年 5 月 31 日宣布將 Apache SystemML 孵化畢業,自此成為 Apache 頂級項目。目前 SystemML 作為 Apache 頂級項目的最新版本是 0.14,支持 Spark 2.x。Apache SystemML 在 2016 年被 datamation.com 列為 15 款開源人工智能軟件之一。在部署方面, SystemML 運行環境支持單機和分布式部署。單機部署顯然有利于本地開發的工作,而分布式部署則可以真正發揮機器學習的威力,支持的框架包括 Hadoop 和 Spark。
Apache SystemML 目前支持的機器學習算法有:
-
描述性統計 Descriptive Statistics
該類中的算法用于描述數據集的主要特征。它們提供了對不同觀察或數據記錄計算的有意義的摘要收集在研究中。這些摘要通常構成初步數據探索的基礎,作為其中的一部分更廣泛的統計分析。
- 單變量統計 Univariate Statistics
- 雙變量統計 Bivariate Statistics
- 分層雙變量統計 Stratified Bivariate Statistics
-
分類 Classification
該類中的算法用于基于一些預定義的類或對象對數據進行分組。這是監督學習的特點。分類算法的一個例子是將社交媒體的評論分為正面評價,負面評價或中立評價。
- 多項 Logistic 回歸 Multinomial Logistic Regression
- 支持向量機 Support Vector Machines
- 二進制類支持向量機 Binary-Class Support Vector Machines
- 多類支持向量機 Multi-Class Support Vector Machines
- 樸素貝葉斯 Naive Bayes
- 決策樹 Decision Trees
- 隨機森林 Random Forests
-
聚類 Clustering
聚類是一種無監督的學習類算法。數據集中沒有預定義的類 - 算法在數據中找到關系。聚類算法將數據排列或聚類成若干數量的邏輯組。例如,確定商店客戶的購買模式。
- K 均值聚類 K-Means Clustering
-
回歸 Regression
回歸是另一類監督學習算法。該數據集中的目標變量是連續的。股票市場預測是回歸算法的一個例子。這里的股票價格是目標變量,或者是我們想預測的,而且每天都有變化。
- 線性回歸 Linear Regression
- 逐步線性回歸 Stepwise Linear Regression
- 廣義線性模型 Generalized Linear Models
- 逐步廣義線性回歸 Stepwise Generalized Linear Regression
- 回歸計分與預測 Regression Scoring and Prediction
-
矩陣分解 Matrix Factorization
矩陣分解算法用于發現嵌入在不同實體之間的交互中的潛在特征。它們利用多個矩陣,當它們相乘時,生成一個類似于原先矩陣的新矩陣。亞馬遜和 Netflix 使用矩陣因式分解算法來提出產品建議。例如每行代表您的一個客戶,每列表示您的一個產品,矩陣是大而稀疏的。因此,每個單元代表由特定客戶購買的特定產品。該矩陣首先填充歷史數據,然后將原始矩陣分解為"產品因素"和"客戶因素"兩個因素。通過將這兩個因子相乘在一起,我們產生添加到矩陣中的新的非零值。這些新的非零值表示產品建議。
- 主成分分析 Principal Component Analysis
- 通過交替最小化完成矩陣 Matrix Completion via Alternating Minimizations
-
生存分析 Survival Analysis
生存分析檢查感興趣的特定事件發生所需的時間。換句話說,它們用于估計生存概率。 例如,在醫學研究中,原型的這種事件是患者的死亡,但是該方法可以應用于其他應用領域,例如在心理實驗中完成個人的任務或者在工程中的電氣部件的故障。
- Kaplan-Meier 生存分析 Kaplan-Meier Survival Analysis
- Cox 比例風險回歸模型 Cox Proportional Hazard Regression Model
Apache SystemML 特點和架構
Apache SystemML 具備兩種非常的能力在機器學 習領 域獨 領風騷 。聲明式機器學 習 ( Declarative Machine Learning 簡稱 DML ) 使表達 ML 算法更容易和更自然。 算法可以用 類 似 R 的 語 法或 類 Python 語法來表示。 DML 通 過 提供表達自定 義 分析的完全靈活性以及與底 層輸 入格式和物理數據表示形式的數據獨立性, 顯 著提高了數據科學家的生 產 力。其次, Apache SystemML 根據數據和集群特性提供自 動優 化,以確保效率和可 擴 展性。 Apache SystemML 為使用大數據的機器學習提供了最佳性能。它可以在 MapReduce 或 Spark 環境中運行,它可以自動優化并實現性能擴展,自動確定算法是在單機還是在集群上運行。
當對小數據量進行機器學習時,數據科學家可以利用 R 或 Python 編寫專為數據解讀而設計的高級代碼。該代碼可以在單機上上運行,返回給數據科學家的結果可能不是預期的,而是一個迭代的結果,然后開始修改代碼和重新評估結果的過程,這一直持續到科學家認為結果是可以接受的,這種方法適用于小數據量。對于大數據的情況,則需要采用 Hadoop 或者 Spark 計算機集群,在這種情況下,數據科學家像以前一樣寫高級代碼,但必須依靠程序員將代碼重新實現或轉換為分布式平臺的代碼,這經常需要消耗大量的時間和精力。進行第一次迭代的結果被傳回給數據科學家,與小數據一樣,結果不太可能是數據科學家預期,并且需要對算法進行一些調整。取決于算法的復雜性和要分析的數據量,迭代可能需要幾天甚至幾周才能運行,每個代碼重寫和重新轉換都容易產生錯誤。
如圖 1 所示,SystemML 的作用是翻譯數據科學家的代碼為可擴展的可執行程序,這有利于大大減少每次迭代的運行時間,同時 SystemML 將性能和可擴展性結合在一起,代碼量遠遠小于其他方式。
圖 1. Apache SystemML 是基于大數據的解決方案
為了說明 Apache SystemML 的性能,比較了三種不同的稀疏集合:小數據量,中等數據規模和大量數據。小數據量包含 1.2 GB 數據,中等數據量包含 12 GB 數據,大量數據 120 GB 數據,在 6 節點計算機集群上分別用 R、Spark MLlib 和 SystemML 運行同樣的算法。首先,R 代碼需要超過一天多的時間才能最終達成小數據量的計算, 由于內存 不足錯誤,R 從未完成在中型和大型數據集上的運行,顯而易見 R 不是為大數據分析設計的。Spark MLlib 在小數據和中等數據情況表現很好, 可以卻花 費 了超過一天的 時間 來運行大數據集。 Apache SystemML 超越了其他方案,在各種數據量下均能快速完成分析任務, 如圖 2 所示。
圖 2. Apache SystemML 的性能
Apache SystemML 能實現大數據的機器學習的能力和高性能源于 SystemML 優化器,用來自動執行關鍵的性能決策,分布式還是本地計算? 如何進行數據分片? 是否需要磁盤和內存交互? Apache SystemML 支持分布式和本地的混合運算,SystemML 優化器可以支持 Spark Driver 中的多線程計算,Spark Executors 中的分布式計算以及優化器進行基于成本的選擇。如圖 3 所示,優化器的輸入是算法,輸出則是生成的分布式計算代碼。優化器分為三個部分,語言層、高層次操作層(HOP)、低層次操作層(LOP)。
- 語言層完成了三種不同的操作:解析,變量分析和驗證,輸入代碼被分成基本塊,然后在適用的地方進行優化。
- 高層次操作層(HOP)創建表示塊的數據流圖,根據數據統計信息確定作業分配。優化器從基于內存和成本估算的替代執行計劃中選擇,并確定操作符的順序和選擇,選擇分布式、本地或混合運算方式。SystemML 有一個廣泛的重寫庫,這些重寫用于優化代碼。
- 低層次操作層(LOP)生成物理執行計劃,進一步優化 Spark、Map-Reduce 的作業。
圖 3. Apache SystemML 的架構和優化
Apache SystemML 執行模式
Apache SystemML 提供了多種執行模式,數據科學家可以在單機上開發一個算法,然后進行擴展,使用 Spark 或 Hadoop 將該算法用于分發群集。Apache SystemML 的執行模式分為以下五種,鑒于 SystemML 的主要目的是在大型分布式數據集上執行機器學習,調用 SystemML 的兩個最重要的方法是 Hadoop Batch 和 Spark Batch 模式。
Spark MLContext
Spark MLContext API 提供了一個編程接口,用于使用 Scala,Java 和 Python 等語言從 Spark 與 SystemML 進行交互。 因此,它提供了一種方便的方式來與 Spark Shell 和 Notebook (如 Jupyter 和 Zeppelin)進行交互。
Spark Batch
Spark Batch 模式可以使用 spark-submit SystemML.jar 在批處理模式下調用 SystemML,調用的 DML 腳本在 -f 參數后面指定。
Hadoop Batch
Hadoop Batch 模式可以使用 hadoop jar SystemML.jar 在批處理模式下調用 SystemML,調用的 DML 腳本在 -f 參數后面指定。
Standalone
SystemML 的獨立模式旨在允許數據科學家在單個機器上快速原型算法。 在獨立模式下,所有操作均發生在非 Hadoop 環境中的單個節點上。 獨立模式不適用于大型數據集。對于大規模生產環境,SystemML 算法執行可以使用 Apache Hadoop 或 Apache Spark 分布在多節點集群中。
JMLC
Java 機器學習連接器(Java Machine Learning Connector 簡稱 JMLC) API 是用于以嵌入式方式與 SystemML 交互的編程接口。為了使用 JMLC,由于 JMLC 在現有的 Java 虛擬機中調用了 SystemML,所以需要在 Java 應用程序的類路徑中包含 SystemML jar 文件。這種可嵌入性使得 SystemML 成為生產流程的一部分,用于諸如評分等任務。JMLC 的主要目的是作為一個評分 API,您的評分功能使用 SystemML 的 DML (聲明式機器學習)語言表達。在相當少量的輸入數據上,單個 JVM 上的單個計算機上產生相對較小量的輸出數據。
由于啟動成本,往往是最佳做法做批量打分,例如一次記錄 1000 條記錄。對于大量數據,建議以 SystemML 的分布式模式(如 Spark 批處理模式或 Hadoop 批處理模式)運行 DML,以利用 SystemML 的分布式計算功能。 JMLC 以性能為代價提供可嵌入性,因此其使用取決于正在處理的業務用例的性質。
Apache SystemML 安裝和部署
IBM Biginsights 是業界領先的 Hadoop 企業級發行版本,在世界著名 IT 行業獨立研究公司 Forrester 從 2012 年到 2016 年發布的三次 Hadoop 解決方案的評測報告中,IBM BigInsights 一直處于領導者位置。IBM BigInsights 以 Apache Hadoop 及其相關開源項目作為核心組件,并在 Hadoop 開源框架的基礎上進行了大量的企業化增強。IBM Biginsights 包含 Apache SystemML 最新的版本,可以直接部署。通常 Apache SystemML 會和 Spark 一起使用,systemml 必須和 spark 節點安裝在一起,并且需要在多節點部署。IBM Biginsights 4.2 以后的版本,比如 版本 4.2.5 就可以通過 Ambari 來安裝和管理 SystemML 組件,如圖 4 所示。
圖 4. IBM Biginsights 包含 Apache SystemML
IBM Biginsights 4.2 版本可以把 Apache SystemML 單獨添加到現有的安裝中。清單 1 給出了在 IBM Biginsights 4.2 一個節點上部署 Apache SystemML 的部署腳本。其他 Hadoop 發行版用戶可以從 http://systemml.apache.org 下載 Apache SystemML 最新的版本按照類似清單 1 的方式部署。
清單 1. IBM BigInsights 4.2 部署 Apache SystemML
[root@bi01 ~]# cd /var/www/html/repos/IOP/RHEL7/x86_64/4.2.0.0/systemml/noarch [root@bi01 noarch]# yum install -y apache_systemml* Installed: apache_systemml_4.2.0.0.noarch 0:0.10.0_IBM_2-000000 Complete!
基于 IBM BigInsights 的大數據機器學習實例
下面使用 IBM BigInsights 4.2 的 SystemML 0.10 版本來做一個實際機器學習的例子,數據來自互聯網的航空數據,場景是預測飛機延誤。
- 首先需要下載并加載到 HDFS 上,如清單 2 所示。
清單 2. 數據準備
[spark@bi01 ~]$ wget http://stat-computing.org/dataexpo/2009/2007.csv.bz2 [spark@bi01 ~]$ hadoop fs -put 2007.csv.bz2 /user/spark/
- 這個例子除了需要 SystemML 類庫外,還需要用到 Spark 解析和查詢 CSV 格式的類庫,為了說明方便采用 spark-shell 的方式來執行這個例子,它的執行方式是 Spark MLContext,如清單 3 所示。
清單 3. 啟動 Apache SystemML 的 Spark 環境
[spark@bi01 ~]$ spark-shell --master yarn-client --jars /usr/iop/current/systemml-client/lib/systemml.jar --packages com.databricks:spark-csv_2.10:1.4.0 --num-executors 3 --driver-memory 2G --executor-memory 6G
- 如清單 4 所示使用 Spark CSV 類庫將數據集加載到 DataFrame 中。
清單 4. 數據加載
scala> import sys.process._ scala> import java.net.URL scala> import java.io.File scala> import org.apache.spark.sql.SQLContext scala> import org.apache.spark.storage.StorageLevel scala> val sqlContext = new SQLContext(sc) scala> val fmt = sqlContext.read.format("com.databricks.spark.csv") scala> val opt = fmt.options(Map("header"->"true", "inferSchema"->"true")) scala> val localFilePath = "hdfs://bi01.ibm.com:8020/user/spark/2007.csv.bz2" scala> val airline = opt.load(localFilePath).na.replace( "*", Map("NA" -> "0.0") ) scala> airline.printSchema root |-- Year: integer (nullable = true) |-- Month: integer (nullable = true) |-- DayofMonth: integer (nullable = true) |-- DayOfWeek: integer (nullable = true) |-- DepTime: string (nullable = true) |-- CRSDepTime: integer (nullable = true) |-- ArrTime: string (nullable = true) |-- CRSArrTime: integer (nullable = true) |-- UniqueCarrier: string (nullable = true) |-- FlightNum: integer (nullable = true) |-- TailNum: string (nullable = true) |-- ActualElapsedTime: string (nullable = true) |-- CRSElapsedTime: string (nullable = true) |-- AirTime: string (nullable = true) |-- ArrDelay: string (nullable = true) |-- DepDelay: string (nullable = true) |-- Origin: string (nullable = true) |-- Dest: string (nullable = true) |-- Distance: integer (nullable = true) |-- TaxiIn: integer (nullable = true) |-- TaxiOut: integer (nullable = true) |-- Cancelled: integer (nullable = true) |-- CancellationCode: string (nullable = true) |-- Diverted: integer (nullable = true) |-- CarrierDelay: integer (nullable = true) |-- WeatherDelay: integer (nullable = true) |-- NASDelay: integer (nullable = true) |-- SecurityDelay: integer (nullable = true) |-- LateAircraftDelay: integer (nullable = true)
- 如清單 5 所示使用 Spark SQL 查看哪些機場延誤最多。
清單 5. 數據探索
scala> airline.registerTempTable("airline") scala> sqlContext.sql("""SELECT Origin, count(*) conFlight, avg(DepDelay) delay | FROM airline | GROUP BY Origin | ORDER BY delay DESC""").show +------+---------+------------------+ |Origin|conFlight| delay| +------+---------+------------------+ | PIR| 4| 45.5| | ACK| 314|45.296178343949045| | SOP| 195| 34.02051282051282| | HHH| 997| 22.58776328986961| | MCN| 992|22.496975806451612| | AKN| 235|21.123404255319148| | CEC| 1055|20.807582938388627| | GNV| 1927| 20.69797612869746| | EYW| 1052|20.224334600760457| | ACY| 735|20.141496598639456| | SPI| 1745|19.545558739255014| | GST| 90|19.233333333333334| | EWR| 154113|18.800853918877706| | BRW| 726| 18.02754820936639| | AGS| 2286|17.728346456692915| | ORD| 375784|17.695756072637472| | TRI| 1207| 17.63628831814416| | SBN| 5128|17.505850234009362| | FAY| 2185| 17.48970251716247| | PHL| 104063|17.067776250924922| +------+---------+------------------+ only showing top 20 rows
- 這個例子是預測出發地是 JFK 且延誤超過 15 個航班,如果超過 15 則延誤標記為 1.0,沒有超過 15 標記為 2.0。如清單 6 所示進行數據預處理,隨機把數據集分成 70% 的訓練數據和 30% 的測試數據。模型訓練的數據有 81307 條,用來驗證模型的測試數據有 34882 條。
清單 6. 數據預處理
scala> sqlContext.udf.register("checkDelay", (depDelay:String) => try { if(depDelay.toDouble > 15) 1.0 else 2.0 } catch { case e:Exception => 1.0 }) scala> val tempSmallAirlineData = sqlContext.sql("SELECT *, checkDelay(DepDelay) label FROM airline WHERE Origin = 'JFK'").persist(StorageLevel.MEMORY_AND_DISK) scala> val popularDest = tempSmallAirlineData.select("Dest").map(y => (y.get(0).toString, 1)).reduceByKey(_ + _).filter(_._2 > 1000).collect.toMap scala> sqlContext.udf.register("onlyUsePopularDest", (x:String) => popularDest.contains(x)) scala> tempSmallAirlineData.registerTempTable("tempAirline") scala> val smallAirlineData = sqlContext.sql("SELECT * FROM tempAirline WHERE onlyUsePopularDest(Dest)") scala> val datasets = smallAirlineData.randomSplit(Array(0.7, 0.3)) scala> val trainDataset = datasets(0).cache scala> val testDataset = datasets(1).cache scala> trainDataset.count res8: Long = 81307 scala> testDataset.count res9: Long = 34882
- 使用 One-hot encoding 對目的地進行編碼,并包括列 Year,Month,DayofMonth,DayOfWeek,Distance 。 One-hot encoding 是將一 列標簽索引映射到一列二進制向量,最多只有一個單值。 該編碼允許期望連續特征(例如邏輯回歸)的算法使用分類特征。
清單 7. 數據編碼
scala> import org.apache.spark.ml.feature.{OneHotEncoder, StringIndexer, VectorAssembler} scala> val indexer = new StringIndexer().setInputCol("Dest").setOutputCol("DestIndex").setHandleInvalid("skip") scala> val encoder = new OneHotEncoder().setInputCol("DestIndex").setOutputCol("DestVec") scala> val assembler = new VectorAssembler().setInputCols(Array("Year","Month","DayofMonth","DayOfWeek","Distance","DestVec")).setOutputCol("features")
- 使用 SystemML 構建模型,實際調用 SystemML 的 MultiLogReg.dml(用于訓練)如清單 7 所示,MultiLogReg.dml 腳本執行二項式和多項邏輯回歸。在這個例子中設置了以下參數,并用 70% 的訓練數據進行模型訓練。
- reg: (缺省值: 0.0) L2 正則化參數,設置為 1e-4
- tol: (缺省值: 0.000001) 公差,用于收斂標準,設置為 1e-2
- mii: (缺省值: 0) 內部迭代的最大數目,設置為 0
- moi: (缺省值: 100) 最大外部迭代次數,設置為 100
清單 7. 預測模型
scala> import org.apache.spark.ml.Pipeline scala> import org.apache.sysml.api.ml.LogisticRegression scala> val lr = new LogisticRegression("log", sc).setRegParam(1e-4).setTol(1e-2).setMaxInnerIter(0).setMaxOuterIter(100) scala> val pipeline = new Pipeline().setStages(Array(indexer, encoder, assembler, lr)) scala> val model = pipeline.fit(trainDataset) BEGIN MULTINOMIAL LOGISTIC REGRESSION SCRIPT Reading X... Reading Y... -- Initially: Objective = 56332.764511287314, Gradient Norm = 4.442549498590815E7, Trust Delta = 0.001024586722033724 -- Outer Iteration 1: Had 1 CG iterations -- Obj.Reduction: Actual = 9183.298853323096, Predicted = 8838.441994939885 (A/P: 1.039), Trust Delta = 4.1405507117841964E-4 -- New Objective = 47149.46565796422, Beta Change Norm = 3.978995393407976E-4, Gradient Norm = 3449234.078105791 -- Outer Iteration 2: Had 2 CG iterations -- Obj.Reduction: Actual = 105.15284603631153, Predicted = 103.41131167333731 (A/P: 1.0168), Trust Delta = 4.1405507117841964E-4 -- New Objective = 47044.312811927906, Beta Change Norm = 1.0251350174812022E-4, Gradient Norm = 83156.34844588072 Termination / Convergence condition satisfied. model: org.apache.spark.ml.PipelineModel = pipeline_4bb95fa082de
- 最后用 30% 的測試數據進行預測,實際調用 SystemML 的 GLM-predict.dml(用于預測)。如清單 8 所示,列出了航班預測的結果以及實際延誤的情況,并最后計算出模型的均方根誤差。
清單 8. 模型評估
scala> val predictions = model.transform(testDataset.withColumnRenamed("label", "OriginalLabel")) scala>predictions.select("prediction", "OriginalLabel").show +----------+-------------+ |prediction|OriginalLabel| +----------+-------------+ | 1.0| 1.0| | 1.0| 1.0| | 1.0| 1.0| | 1.0| 1.0| | 1.0| 2.0| | 1.0| 2.0| | 1.0| 1.0| | 1.0| 1.0| | 1.0| 2.0| | 1.0| 2.0| | 1.0| 1.0| | 1.0| 2.0| | 1.0| 2.0| | 1.0| 2.0| | 1.0| 2.0| | 1.0| 1.0| | 1.0| 2.0| | 1.0| 2.0| | 1.0| 1.0| | 1.0| 1.0| +----------+-------------+ only showing top 20 rows scala> sqlContext.udf.register("square", (x:Double) => Math.pow(x, 2.0)) scala> predictions.registerTempTable("predictions") scala> sqlContext.sql("SELECT sqrt(avg(square(OriginalLabel - prediction))) FROM predictions").show +------------------+ | _c0| +------------------+ |0.8567701236741244| +------------------+
總結
本文通過理論聯系實際的方式描述了如何在 IBM BigInsights 利用 Apache SystemML 進行大數據平臺的機器學習。
SystemML 是一個靈活的,可 擴 展的機器學 習 系 統 。 SystemML 的特點是:
- 通 過類 似 R 和 類 似 Python 的 語 言 進 行算法定制。
- 多種 執 行模式,包括 Spark MLContext , Spark Batch , Hadoop Batch , Standalone 和 JMLC 。
- 基于數據和集群特征的自 動優 化,以確保效率和可 擴 展性。
IBM BigInsights 是業界領先的 Hadoop 企業級發行版本,不僅包含 Apache SystemML 組件也對其進行企業級技術支持。IBM BigInsights 最新版本包含的 Jupyter Notebook 可以方便地進行 SystemML 的機器學習代碼的編寫和調試。
- 訪問 IBM 大數據大學 ,獲取有關 Hadoop 和大數據的免費課程。
- 獲取有關IBM Biginsights 的資源。
- 查閱" Apache SystemML 官方網站 ",了解 Apache SystemML 的最新信息。
- 查閱" Apache SystemML 文檔 ",掌握 Apache SystemML 的使用方法。
獲得產品和技術
- 下載試用版本的IBM BigInsights
- 參閱 IBM BigInsights 信息中心 獲取產品文檔
- 下載 Apache SystemML
討論
- 到 IBM BigInsights 在 IBM developerWorks 的論壇 參與討論
- 到 IBM BigInsights 在 StackExchange 的論壇 參與討論
- 查看我的博客 并評論
來自:http://www.ibm.com/developerworks/cn/analytics/library/ba-cn-apache-systemml-ibm-biginsights/index.html?ca=drs-