資料
Spark機器學習庫(MLlib)中文指南
關於spark機器學習的知乎專欄
Spark入門實戰系列--8.Spark MLlib(上)--機器學習及SparkMLlib簡介
基本Kmeans算法介紹及其實現
spark MLlib 概念 1:相關系數( PPMCC or PCC or Pearson's r皮爾森相關系數) and Spearman's correlation(史匹曼等級相關系數)
皮爾森相關系數定義: 協方差與標准差乘積的商。
機器學習中的算法(2)-支持向量機(SVM)基礎
mllib
對於我這種以前就是聽一聽機器學習里面的名詞沒深入的學過的人來說,這簡直就是個龐然大物,今天這個就是個入門,后面在這里要補上很多東西。
下面是對於sparkMllib的介紹:
MLlib(Machine Learning Library) 是 Spark 的機器學習(ML)庫。其目標是使實用的機器學習具有可擴展性並且變得容易,它能夠較容易地解決一些實際的大規模機器學習問題。在較高的水平上,它提供了以下工具:
- ML Algorithms (ML 算法): 常用的學習算法,如分類,回歸,聚類和協同過濾
- Featurization (特征): 特征提取,變換,降維和選擇
- Pipelines (管道): 用於構建,評估和調整 ML Pipelines 的工具
- Persistence (持久性): 保存和加載算法,模型和 Pipelines
- Utilities (實用): 線性代數,統計學,數據處理等
統計
這是個簡單的例子
//導入統計學支持需要的包
import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics}
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.rdd.RDD
//denseArray是統計學學庫支持的
val array1: Array[Double] = Array[Double](60, 70, 80, 0)
val array2: Array[Double] = Array[Double](80, 50, 0, 90)
val array3: Array[Double] = Array[Double](60, 70, 80, 0)
val denseArray1 = Vectors.dense(array1)
val denseArray2 = Vectors.dense(array2)
val denseArray3 = Vectors.dense(array3)
val seqDenseArray: Seq[Vector] = Seq(denseArray1, denseArray2, denseArray3)
//用三個數組生成的向量序列生成RDD
val basicTestRDD: RDD[Vector] = sc.parallelize[Vector](seqDenseArray)
//獲取統計信息
val summary: MultivariateStatisticalSummary = Statistics.colStats(basicTestRDD)
// 每一列的平均分數,即每門課三位學生的平均分數
println(summary.mean)
// 每一列的方差
println(summary.variance)
// 每一列中不為0的成績數量
println(summary.numNonzeros)
相關性分析
計算兩組數據之間的相關性。MLlib 對 Pearson 相關系數和 Spearman 等級相關系數算法提供支持。
下面這個例子假定的場景是有八個用戶,他們在服務器上有各自早晚的學習時間的記錄,要分析上午用戶學習的時間和晚上用戶學習時間之間的相關性。
然后就是通過這些數據生成RDD
val morningStudyTime: RDD[Double] = sc.parallelize(List(55, 54, 60, 60, 45, 20, 85, 40), 2)
val nightStudyTime: RDD[Double] = sc.parallelize(List(80, 90, 80, 90, 70, 20, 100, 60), 2)
選擇 Pearson 相關系數算法,並調用corr()函數進行計算,並輸出結果
val corrType = "pearson"
val corr: Double = Statistics.corr(morningStudyTime, nightStudyTime, corrType)
println(s"Correlation: \t $corr")
KMeans聚類算法
數據是這樣的:
導入包
import org.apache.spark.mllib.clustering.{KMeans, KMeansModel}
import org.apache.spark.mllib.linalg.Vectors
創建RDD,進而創建Vector,這里使用的數據源是官方自帶的,供測試用的數據源
// 讀取數據文件,創建RDD
val dataFile = "/opt/spark-2.4.4-bin-hadoop2.7/data/mllib/kmeans_data.txt"
val lines = sc.textFile(dataFile)
// 創建Vector,將每行的數據用空格分隔后轉成浮點值返回numpy的array
val data = lines.map(s => Vectors.dense(s.split(' ').map(_.toDouble))).cache()
使用train函數,生成模型
val numClusters = 2
val numIterations = 20
val model = KMeans.train(data, numClusters, numIterations)
統計聚類錯誤的樣本比例,輸出聚集中心
val WSSSE = model.computeCost(data)
println(s"Within Set Sum of Squared Errors = $WSSSE")
//輸出模型的聚集中心
model.clusterCenters
SVM算法
這個看了一下算法的簡介,現在沒有太看懂,其實敲完了代碼也沒有懂,因為api里不涉及這個算法本身。
看不懂,我就學,腦袋學掉了碗大個疤。
先學下api怎么用
首先,需要用到這些包
import org.apache.spark.mllib.classification.{SVMModel, SVMWithSGD}
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
import org.apache.spark.mllib.util.MLUtils
數據文件是官方提供的測試數據,
val dataFile = "/opt/spark-2.4.4-bin-hadoop2.7/data/mllib/sample_libsvm_data.txt"
val data = MLUtils.loadLibSVMFile(sc, dataFile)
分割數據,一部分(80%)用來訓練,一部分(20%)用來測試
// 隨機分割數據,第一個參數指定了分割的比例,第二個參數是一個隨機數種子
val splits = data.randomSplit(Array(0.8, 0.2), seed = 9L)
val training = splits(0).cache()
val test = splits(1)
// 打印分割后的數據量
println("TrainingCount:"+training.count())
println("TestingCount:"+test.count())
開始訓練,調用SVMWithSGD中的train()函數,這個函數的第一個參數為 RDD 訓練數據輸入,第二個參數為迭代次數,這里我們設置迭代 100 次,此外這個函數還有其他的參數來設置 SGD 步驟,正則化參數,每輪迭代輸入的樣本比例,正則化類型等:
val model = SVMWithSGD.train(training, 100)
得到的 SVM 模型后,我們需要進行后續的操作並把結果輸出,清除默認的閾值,清除后會輸出預測的數字:
model.clearThreshold()
使用測試數據進行預測計算
val scoreAndLabels = test.map { point =>
val score = model.predict(point.features)
(score, point.label)
}
輸出結果,包含預測的數字結果和 0/1 結果:
for ((score, label) <- scoreAndLabels.collect())
println(score+","+label)
其他算法實例的文件目錄位置
ml和mllib算法實例的位置
/opt/spark-2.4.4-bin-hadoop2.7/examples/src/main/scala/org/apache/spark/examples/mllib
/opt/spark-2.4.4-bin-hadoop2.7/examples/src/main/scala/org/apache/spark/examples/ml/
官方提供的算法測試數據的位置
/opt/spark-2.4.4-bin-hadoop2.7/data/mllib