日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Spark K-Means

發(fā)布時(shí)間:2023/12/2 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spark K-Means 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。