Spark K-Means
K-Means(K均值)
介紹
K-Means是被應(yīng)用的最廣泛的基于劃分的聚類算法,是一種硬聚類算法,屬于典型的局域原型的目標(biāo)函數(shù)聚類的代表。算法首先隨機(jī)選擇k個(gè)對(duì)象,每個(gè)對(duì)象初始地代表一個(gè)簇的平均值或者中心。對(duì)于剩余的每個(gè)對(duì)象,根據(jù)其到各個(gè)簇中心的距離,把他們分給距離最小的簇中心,然后重新計(jì)算每個(gè)簇平均值。重復(fù)這個(gè)過(guò)程,直到聚類準(zhǔn)則則函數(shù)收斂。準(zhǔn)則函數(shù)一般采用兩種方式:第一種是全局誤差函數(shù),第二種是前后兩次中心誤差變化。
與分類不同,分類是監(jiān)督學(xué)習(xí),要求分類前明確各個(gè)類別,并斷言每個(gè)元素映射到一個(gè)類別,而聚類是觀察式學(xué)習(xí),在聚類前可以不知道類別甚至不給定類別數(shù)量,是無(wú)監(jiān)督學(xué)習(xí)的一種。目前聚類廣泛應(yīng)用于統(tǒng)計(jì)學(xué)、生物學(xué)、數(shù)據(jù)庫(kù)技術(shù)和市場(chǎng)營(yíng)銷等領(lǐng)域,相應(yīng)的算法也非常的多。
K-Means屬于無(wú)監(jiān)督學(xué)習(xí),最大的特別和優(yōu)勢(shì)在于模型的建立不需要訓(xùn)練數(shù)據(jù)。在日常工作中,很多情況下沒(méi)有辦法事先獲取到有效的訓(xùn)練數(shù)據(jù),這時(shí)采用K-Means是一個(gè)不錯(cuò)的選擇。但K-Means需要預(yù)先設(shè)置有多少個(gè)簇類(K值),這對(duì)于像計(jì)算某省份全部電信用戶的交往圈這樣的場(chǎng)景就完全的沒(méi)辦法用K-Means進(jìn)行。對(duì)于可以確定K值不會(huì)太大但不明確精確的K值的場(chǎng)景,可以進(jìn)行迭代運(yùn)算,然后找出cost最小時(shí)所對(duì)應(yīng)的K值,這個(gè)值往往能較好的描述有多少個(gè)簇類。
?
運(yùn)用場(chǎng)景
????? 1.商務(wù)上,幫助市場(chǎng)分析人員從客戶基本庫(kù)中發(fā)現(xiàn)不同的客戶群,并且用購(gòu)買(mǎi)模式來(lái)刻畫(huà)不同的客戶群特征。
????? 2.生物學(xué)上,用于推導(dǎo)植物和動(dòng)物的分類,對(duì)基因的分類,獲得對(duì)種群中固有結(jié)構(gòu)的認(rèn)識(shí)。
????? 3.互聯(lián)網(wǎng)上,用于對(duì)Web上的文檔進(jìn)行分類從而發(fā)現(xiàn)信息。
????? 4.對(duì)一個(gè)游戲中的玩家進(jìn)行分類(下面的案例)。
工作原理
????? 針對(duì)包含n個(gè)對(duì)象的數(shù)據(jù)集合D以及初始化的聚類數(shù)目k,使用下面的算法。
1.從數(shù)據(jù)集合D中隨機(jī)選擇k個(gè)對(duì)象作為初始簇中心。
2.根據(jù)簇的中心值,把數(shù)據(jù)集合中的n個(gè)對(duì)象全部分給最“相似”的簇(“相似”根據(jù)距離長(zhǎng)短來(lái)判斷)。
3.根據(jù)簇的中心值,重新計(jì)算每個(gè)簇的中心值。
4.計(jì)算準(zhǔn)則函數(shù)。
5.若準(zhǔn)則函數(shù)滿足閾值則退出,否則返回第二步繼續(xù)。
輸入數(shù)據(jù)說(shuō)明
數(shù)據(jù):玩家信息(月)
| 玩家(ID) | 游戲時(shí)間(小時(shí)) | 充值金額(元) |
| 1 | 60 | 55 |
| 2 | 90 | 86 |
| 3 | 30 | 22 |
| 4 | 15 | 11 |
| 5 | 288 | 300 |
| 6 | 223 | 200 |
| 7 | 0 | 0 |
| 8 | 14 | 5 |
| 9 | 320 | 280 |
| 10 | 65 | 55 |
| 11 | 13 | 0 |
| 12 | 10 | 18 |
| 13 | 115 | 108 |
| 14 | 3 | 0 |
| 15 | 52 | 40 |
| 16 | 62 | 76 |
| 17 | 73 | 80 |
| 18 | 45 | 30 |
| 19 | 1 | 0 |
| 20 | 180 | 166 |
?
數(shù)據(jù)抽象為如下,含義為 游戲時(shí)間(小時(shí)),充值金額(元)
把玩家分為3類:
1.優(yōu)質(zhì)用戶(高時(shí)長(zhǎng),高消費(fèi))
????? 2.普通玩家(在線時(shí)長(zhǎng)中等,消費(fèi)中等)
????? 3.不活躍用戶??? (在線時(shí)間短,消費(fèi)低)??????????????
流程圖
?
測(cè)試代碼
import org.apache.spark.mllib.clustering.KMeans
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.{SparkConf, SparkContext}
object KMeansTest {
? def main(args: Array[String]) {
????? val conf = new SparkConf()
????? val sc = new SparkContext(conf)
??? val data =sc.textFile(args(0))
??? val parsedData =data.map(s => Vectors.dense(s.split(' ').map(_.trim.toDouble))).cache()
??? //設(shè)置簇的個(gè)數(shù)為3
??? val numClusters =3
??? //迭代20次
??? val numIterations= 20
??? //運(yùn)行10次,選出最優(yōu)解
??? val runs=10
??? val clusters =KMeans.train(parsedData, numClusters, numIterations,runs)
??? // Evaluateclustering by computing Within Set Sum of Squared Errors
??? val WSSSE = clusters.computeCost(parsedData)
??? println("WithinSet Sum of Squared Errors = " + WSSSE)
??? val a21 =clusters.predict(Vectors.dense(57.0,30.0))
??? val a22 =clusters.predict(Vectors.dense(0.0,0.0))
??? //打印出中心點(diǎn)
??? println("Clustercenters:");
??? for (center <-clusters.clusterCenters) {
????? println(" "+ center)
??? }
??? //打印出測(cè)試數(shù)據(jù)屬于哪個(gè)簇
??? println(parsedData.map(v=> v.toString() + " belong to cluster :" +clusters.predict(v)).collect().mkString("\n"))
??? println("預(yù)測(cè)第21個(gè)用戶的歸類為-->"+a21)
??? println("預(yù)測(cè)第22個(gè)用戶的歸類為-->"+a22)
? }
}
提交代碼腳本(standalone模式):
./bin/spark-submit
--name kmeans ??\???????????????????????? (項(xiàng)目名)
--class naiveBayes? \???????????????????? (主類名)
--master spark://master:7077? \???????????(使用集群管理器)
~/Desktop/kmeans.jar???? \ ?????????????????(代碼包位置)
Hdfs://master:9000/KMeansTest.data???????????? (args(0)的參數(shù)值)
輸出結(jié)果說(shuō)明
?
可以明顯的看到:
1類用戶為優(yōu)質(zhì)用戶
2類用戶為普通用戶
3類用戶為不活躍用戶
?
?
21個(gè)用戶的數(shù)據(jù)為(57,30)
22個(gè)的用戶數(shù)據(jù)為(0,0)
分類是正確的
?
三個(gè)簇的聚集中心
轉(zhuǎn)載于:https://www.cnblogs.com/xiaomaohai/p/6158068.html
總結(jié)
以上是生活随笔為你收集整理的Spark K-Means的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言杂记1
- 下一篇: 《你的灯亮着吗》读后感1