Canopy聚類演算法分析

2021-07-04 03:30:34 字數 3271 閱讀 1683

canopy聚類演算法是可以並行執行的演算法,資料並行意味著可以多執行緒進行,加快聚類速度,開源ml庫mahout

使用。一、概念

與傳統的聚類演算法(比如 k-means )不同,

canopy 聚類最大的特點是不需要事先指定 k 值( 即 clustering 的個數),因此具有很大的實際應用價值。

與其他聚類演算法相比,canopy聚類雖然精度較低,但其在速度上有很大優勢,因此可以使用 canopy 聚類先對資料進行「粗」聚類,(

摘自於mahout一書:canopy演算法是一種快速地聚類技術,只需一次遍歷資料集得到結果,無法給出精確的簇結果,但能給出最優的簇數量。可為k均值演算法優化超引數..k....

)得到 k 值後再使用 k-means 進行進一步「細」聚類。這種canopy + k-means的混合聚類方式分為以下兩步:

step1、聚類最耗費計算的地方是計算物件相似性的時候,canopy 聚類在第一階段選擇簡單、計算代價較低的方法計算物件相似性,將相似的物件放在乙個子集中,這個子集被叫做canopy

,通過一系列計算得到若干canopy,canopy 之間可以是重疊的,但不會存在某個物件不屬於任何canopy的情況,可以把這一階段看做資料預處理;

step2、在各個canopy 內使用傳統的聚類方法(如k-means),不屬於同一canopy 的物件之間不進行相似性計算。

從這個方法起碼可以看出兩點好處:首先,canopy 不要太大且canopy 之間重疊的不要太多的話會大大減少後續需要計算相似性的物件的個數;其次,類似於k-means這樣的聚類方法是需要人為指出k的值的,通過stage1得到的canopy 個數完全可以作為這個k值,一定程度上減少了選擇k的盲目性。

二、聚類精度

對傳統聚類來說,例如k-means、expectation-maximization、greedy agglomerative clustering,某個物件與cluster的相似性是該點到cluster中心的距離,那麼聚類精度能夠被很好保證的條件是:對於每個cluster都存在乙個canopy,它包含所有屬於這個cluster的元素。

如果這種相似性的度量為當前點與某個cluster中離的最近的點的距離,那麼聚類精度能夠被很好保證的條件是:對於每個cluster都存在若干個canopy,這些canopy之間由cluster中的元素連線(重疊的部分包含cluster中的元素)。

資料集的canopy劃分完成後,類似於下圖:

(1)將資料集向量化得到乙個list後放入記憶體,選擇兩個距離閾值:t1和t2,其中t1 > t2,對應上圖,實線圈為t1,虛線圈為t2,t1和t2的值可以用交叉校驗來確定;

(2)從list中任取一點p,用低計算成本方法快速計算點p與所有canopy之間的距離(如果當前不存在canopy,則把點p作為乙個canopy),如果點p與某個canopy距離在t1以內,則將點p加入到這個canopy;

(3)如果點p曾經與某個canopy的距離在t2以內,則需要把點p從list中刪除,這一步是認為點p此時與這個canopy已經夠近了,因此它不可以再做其它canopy的中心了;

(4)重複步驟2、3,直到list為空結束。 

注意:canopy聚類不要求指定簇中心的個數,中心的個數僅僅依賴於距離度量,t1和t2的選擇。

python**:

#-*- coding:utf-8 -*-   

'''''

'''

import numpy as np

import matplotlib as nlp

#the first op

import scipy as sp

import scipy.sparse.linalg

import time

from old_regression import crossvalidation

#使用k均值

import kmeans as km

def canopyclustering(datalist):

state =;

#交叉驗證獲取t1和t2;

t1,t2 = crossvalidation(datalist);

#canopy 預聚類

canopybins= canopy(datalist, t1 , t2);

#使用k均值聚類

k =len(canopybins);

createcent = [canopy[0] for canopy in canopybins];#獲取canopybins中心

dataset = datalist;

centroids, clusterassment =km.kmeans(dataset, k, distmeas=disteclud, createcent);

return clusterassment;

#得到乙個list後放入記憶體,選擇兩個距離閾值:t1和t2,其中t1 > t2

#canopy聚類不要求指定簇中心的個數,中心的個數僅僅依賴於舉例度量,t1和t2的選擇。

def canopy(datalist, t1 , t2):

#state = ;datalist = ;

#初始化第乙個canopy元素

canopyinit = datalist.pop();

canopycenter= calcanopycenter([canopyinit] );

canopyc = [canopyinit];#建立第乙個canopy

canopybins = ;

while not(len(datalist) ==0 ):

pointnow =datalist[len(datalist)-1 ];#pointnow =datalist.pop();

counter = 0;

for canopy in canopybins:

dis =caldis(pointnow, canopy[0]);

#如果點p與某個canopy距離在t1以內,則將點p加入到這個canopy;

if dis

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

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

Canopy聚類演算法過程

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

Spark實現Canopy聚類演算法

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