离线轻量级大数据平台Spark之MLib机器学习库聚类算法KMeans实例
生活随笔
收集整理的這篇文章主要介紹了
离线轻量级大数据平台Spark之MLib机器学习库聚类算法KMeans实例
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、KMeans算法
所謂聚類問題,就是給定一個元素集合D,其中每個元素具有n個可觀察屬性,使用某種算法將D劃分成k個子集,要求每個子集內(nèi)部的元素之間相異度盡可能低,而不同子集的元素相異度盡可能高。其中每個子集叫做一個簇。與分類不同,分類是示例式學習,要求分類前明確各個類別,并斷言每個元素映射到一個類別。而聚類是觀察式學習,在聚類前可以不知道類別甚至不給定類別數(shù)量,是無監(jiān)督學習的一種。
聚類算法是機器學習(或者說是數(shù)據(jù)挖掘更合適)中重要的一部分,除了最為簡單的K-Means聚類算法外,比較常見的還有層次法(CURE、CHAMELEON等)、網(wǎng)格算法(STING、WaveCluster等)等。K-means聚類屬于無監(jiān)督學習,而回歸、樸素貝葉斯、SVM等都是有類別標簽y的,也就是說樣例中已經(jīng)給出了樣例的分類。而聚類的樣本中卻沒有給定y,只有特征x。K-Means屬于基于平方誤差的迭代重分配聚類算法,其核心思想十分簡單:
l隨機選擇K個中心點;
l計算所有點到這K個中心點的距離,選擇距離最近的中心點為其所在的簇;
l簡單地采用算術平均數(shù)(mean)來重新計算K個簇的中心;
l重復步驟2和3,直至簇類不再發(fā)生變化或者達到最大迭代值;
l輸出結果。
K-Means算法的結果好壞依賴于對初始聚類中心的選擇,容易陷入局部最優(yōu)解,對K值的選擇沒有準則可依循,對異常數(shù)據(jù)較為敏感,只能處理數(shù)值屬性的數(shù)據(jù),聚類結構可能不平衡。
實例中進行如下步驟:
? 裝載數(shù)據(jù),數(shù)據(jù)以文本文件方式進行存放;
? 將數(shù)據(jù)集聚類,設置2個類和20次迭代,進行模型訓練形成數(shù)據(jù)模型;
? 打印數(shù)據(jù)模型的中心點;
? 使用誤差平方之和來評估數(shù)據(jù)模型;
? 使用模型測試單點數(shù)據(jù);
? 保存模型并加載模型。
2、Java開發(fā)
? ? ? Java開發(fā)上,引入spark-mllib_2.11-2.0.1.jar、spark-mllib-local_2.11-2.0.1.jar、spark-catalyst_2.11-2.0.1.jar。
? ? ?參考spark的example案例的代碼,輸出skkm.jar包并提交執(zhí)行。
bin/spark-submit --class sk.mlib.KMeansDemo --master local /tmp/skkm.jar
具體代碼如下:
package sk.mlib;import java.util.Arrays; import java.util.logging.Level;import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.JavaDoubleRDD; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.function.Function; import org.apache.spark.mllib.clustering.KMeans; import org.apache.spark.mllib.clustering.KMeansModel; import org.apache.spark.mllib.linalg.Vector; import org.apache.spark.mllib.linalg.Vectors;public class KMeansDemo {public static void main(String[] args) throws Exception {String path = "/tmp/kmeansData.txt";SparkConf conf = new SparkConf().setAppName("JavaKMeansExample");JavaSparkContext jsc = new JavaSparkContext(conf);jsc.setLogLevel("OFF");//關閉日志輸出,方便查看輸出結果// Load and parse dataJavaRDD<String> data = jsc.textFile(path);JavaRDD<Vector> parsedData = data.map(new Function<String, Vector>() {public Vector call(String s) {String[] sarray = s.split(" ");double[] values = new double[sarray.length];for (int i = 0; i < sarray.length; i++) {values[i] = Double.parseDouble(sarray[i]);}return Vectors.dense(values);}});parsedData.cache();// Cluster the data into two classes using KMeans// 將數(shù)據(jù)集聚類,2個類,20次迭代,進行模型訓練形成數(shù)據(jù)模型int numClusters = 2;int numIterations = 20;KMeansModel clusters = KMeans.train(parsedData.rdd(), numClusters, numIterations);// 打印數(shù)據(jù)模型的中心點System.out.println("Cluster centers:");for (Vector center: clusters.clusterCenters()) {System.out.println(" " + center);}// 使用誤差平方之和來評估數(shù)據(jù)模型double cost = clusters.computeCost(parsedData.rdd());System.out.println("Cost: " + cost);// Evaluate clustering by computing Within Set Sum of Squared Errorsdouble WSSSE = clusters.computeCost(parsedData.rdd());System.out.println("Within Set Sum of Squared Errors = " + WSSSE);// 使用模型測試單點數(shù)據(jù)// JavaDoubleRDD testdata1=jsc.parallelizeDoubles(Arrays.asList(0.25,0.25,0.25));double[] testdata1={0.25,0.25,0.25};double[] testdata2={8.12,8.12,8.12};System.out.println("Vectors 0.25 0.25 0.25 is belongs to clusters:" + clusters.predict(Vectors.dense(testdata1)));System.out.println("Vectors 8.12,8.12,8.12 is belongs to clusters:" + clusters.predict(Vectors.dense(testdata2)));// Save and load modelclusters.save(jsc.sc(), "/tmp/KMeansModel");KMeansModel sameModel = KMeansModel.load(jsc.sc(),"/tmp/KMeansModel");// 打印導出的數(shù)據(jù)模型的中心點System.out.println("Cluster centers:");for (Vector center: sameModel.clusterCenters()) {System.out.println(" " + center);}jsc.stop();}}/*測試數(shù)據(jù)kmeansData.txt: 0.0 0.0 0.0 0.1 0.1 0.1 0.2 0.2 0.2 9.0 9.0 9.0 9.1 9.1 9.1 9.2 9.2 9.2 */ //提交執(zhí)行:bin/spark-submit --class sk.mlib.KMeansDemo --master local /tmp/skkm.jar /*執(zhí)行結果:Cluster centers:[9.1,9.1,9.1][0.1,0.1,0.1] Cost: 0.11999999999994547 Within Set Sum of Squared Errors = 0.11999999999994547 Vectors 0.25 0.25 0.25 is belongs to clusters:1 Vectors 8.12,8.12,8.12 is belongs to clusters:0 Cluster centers:[9.1,9.1,9.1][0.1,0.1,0.1] */總結
以上是生活随笔為你收集整理的离线轻量级大数据平台Spark之MLib机器学习库聚类算法KMeans实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 离线轻量级大数据平台Spark之MLib
- 下一篇: 离线轻量级大数据平台Spark之MLib