Spark實現Canopy聚類演算法

2021-09-23 08:15:17 字數 2497 閱讀 5511

為什麼需要canopy演算法

canopy演算法一般是為其他聚類演算法的一種聚類方法,常用的聚類如 k-means 等聚類演算法都需要事先k值(即聚類個數),並且會隨機選擇k個初始聚類中心。這種實現指定的k和隨機初始化的聚類中心不僅會降低聚類演算法的效率,而且得到的結果也可能是區域性最優的。canopy演算法就可以解決以上問題。

canopy演算法的步驟

canopy演算法的核心步驟如下:

給定一組待聚類的資料集d;

給定兩個閾值 t1,t2 且t1 > t2;

隨機選擇d中的乙個資料d作為中心,並將d從d中移除;

計算d中所有點到d的距離distance;

將所有distance < t1的點歸到以d為中心的canopy1類中;

將所有distance < t2的點從d中移除;

重複步驟4-6,直到d為空,形成多個canopy類。

從canopy演算法實現的步驟來看,canopy演算法的優點明顯,同時也存在一定的缺點:就是要事先指定合適的t1 和 t2

canopy聚類過程如圖所示:

**實現

本案例以鳶尾花資料集為例

// 資料載入

val irisdata = spark.read

.option("header", true)

.option("inferschema", true)

.csv(inputfile)

資料預處理//

val schema = irisdata.schema

val fts = schema.filternot(_.name == """class""").map(_.name).toarray

// 特徵處理

val amountvectorassembler: vectorassembler = new vectorassembler()

.setinputcols(fts)

.setoutputcol("features")

val ftsdf = amountvectorassembler

.transform(irisdata)

.select("features")

// 計算歐式距離

def euclidean(p1: seq[double], p2: seq[double]) =

sqrt(distant)

}// canopy聚類演算法過程

def conapyrunner(df: dataframe, t1: double, t2: double) = )

val distancedf = dfcopy

.withcolumn("distance", distanceudf($"features"))

.withcolumn("t2threshold", $"distance".getfield("_2"))

.withcolumn("t1threshold", $"distance".getfield("_1"))

// 將距離小於t1的輸出 同時剔除的還有初始點d

resultdf = resultdf.union(

distancedf

.where($"t1threshold")

.select($"features", lit(cluster) as "cluster")

)// 將距離小於t2的點從資料集移除

dfcopy = distancedf

.where(!$"t2threshold")

.select($"features")

// 判斷df是否已經為空 df為空時 結束迴圈

flag = !dfcopy.isempty

}// 返回聚類結果集

resultdf

}// 聚類方法呼叫

val dd = conapyrunner(ftsdf, 4, 1.5)

dd.show()

結果檢視(已省略部分展示結果)

+-----------------+--------+

| features|conapyid|

+-----------------+--------+

|[5.1,3.5,1.4,0.2]| 1|

|[4.9,3.0,1.4,0.2]| 1|

|[5.6,2.5,3.9,1.1]| 2|

|[5.9,3.2,4.8,1.8]| 2|

+-----------------+--------+

從演算法可以得知,使用canopy聚類時,產生的各類之間可能是有交集的,資料集的canopy劃分完成後,類似於下圖:

canopy演算法流程 Canopy聚類演算法

一 概念 與傳統的聚類演算法 比如k means 不同,canopy聚類最大的特點是不需要事先指定k值 即clustering的個數 因此具有很大的實際應用價值。與其他聚類演算法相比,canopy聚類雖然精度較低,但其在速度上有很大優勢,因此可以使用canopy聚類先對資料進行 粗 聚類,得到k值後...

Canopy聚類演算法分析

canopy聚類演算法是可以並行執行的演算法,資料並行意味著可以多執行緒進行,加快聚類速度,開源ml庫mahout 使用。一 概念 與傳統的聚類演算法 比如 k means 不同,canopy 聚類最大的特點是不需要事先指定 k 值 即 clustering 的個數 因此具有很大的實際應用價值。與其...

Canopy聚類演算法過程

前幾天學習canopy演算法,看了上面的流程圖一直不懂,後來對整個流程模擬了一遍,並畫了個圖,才逐漸理解了,現將流程用自己的語言敘述一遍 我們假設每個資料用小圓點來表示。在計算機中用list集合儲存。canopy演算法首先選擇兩個距離閾值 t1和t2,其中t1 t2 1 原始狀態下的資料還沒有分類,...