Sklearn参数详解—聚类算法
總第115篇
前言
聚類是一種非監(jiān)督學(xué)習(xí),是將一份給定數(shù)據(jù)集劃分成k類,這一份數(shù)據(jù)集可能是某公司的一批用戶,也可能是某媒體網(wǎng)站的一系列文章,如果是某公司的一批用戶,那么k-means做的就是根據(jù)用戶的表現(xiàn)對用戶的分類;如果媒體的文章,那么k-means做的就是根據(jù)文章的類型,把他分到不同的類別。
當(dāng)一個公司用戶發(fā)展到一定的量級以后,就沒有辦法以同樣的精力去維護(hù)所有用戶,這個時候就需要根據(jù)用戶的種種表現(xiàn)對用戶進(jìn)行分類,然后根據(jù)用戶類別的不同,采取不同的運(yùn)營策略。而這里的分類方法就是聚類算法。我們這篇文章主要講述一下常用的三種聚類方法:
K-means聚類
層次聚類
密度聚類
K-means聚類算法
K-means聚類算法是最簡單、最基礎(chǔ)的聚類算法,原理很簡單,就是先指定k個點(diǎn),然后計算每一個樣本點(diǎn)分別到這k個點(diǎn)之間的距離,并將不同樣本點(diǎn)劃分到距離最近的那個點(diǎn)的集合,這樣就把所有的樣本分成k類了。比如下圖就是將所有的樣本分為3類。
步驟:
隨機(jī)選擇K個點(diǎn)(質(zhì)心)
通過計算每個點(diǎn)到這K個點(diǎn)之間的距離(這里的距離默認(rèn)是歐式距離,一般也選擇歐式距離,也可以是其他,比如DTW),并將樣本點(diǎn)劃分到距離最近的那個點(diǎn)。
計算劃分后的點(diǎn)的平均值,并將均值作為新的質(zhì)心,繼續(xù)進(jìn)行距離求解,然后重新進(jìn)行劃分,再次求均值,直到均值不發(fā)生變化時循環(huán)停止。
參數(shù)
class?sklearn.cluster.KMeans(n_clusters=8,?init='k-means++',?n_init=10,?max_iter=300,?tol=0.0001,?precompute_distances='auto',?verbose=0,?random_state=None,?copy_x=True,?n_jobs=1,?algorithm='auto')n_clusters:質(zhì)心數(shù)量,也就是分類數(shù),默認(rèn)是8個。
init:初始化質(zhì)心的選取方式,主要有下面三種參數(shù)可選,‘k-means++’、‘random’ or an ndarray,默認(rèn)是'k-means++'。因?yàn)槌跏假|(zhì)心是隨機(jī)選取的,會造成局部最優(yōu)解,所以需要更換幾次隨機(jī)質(zhì)心,這個方法在sklearn中通過給init參數(shù)傳入=“k-means++”即可。
K-means與K-means++區(qū)別:
原始K-means算法最開始隨機(jī)選取數(shù)據(jù)集中K個點(diǎn)作為聚類中心,而K-means++按照如下的思想選取K個聚類中心:
假設(shè)已經(jīng)選取了n個初始聚類中心(0<n<K),則在選取第n+1個聚類中心時:距離當(dāng)前n個聚類中心越遠(yuǎn)的點(diǎn)會有更高的概率被選為第n+1個聚類中心,但在選取第一個聚類中心(n=1)時同樣通過隨機(jī)的方法,之所以這樣做是因?yàn)榫垲愔行幕ハ嚯x得越遠(yuǎn)越好。
n_init:隨機(jī)初始化的次數(shù),kmeans質(zhì)心迭代的次數(shù)。
max_iter:最大迭代次數(shù),默認(rèn)是300。
tol:誤差容忍度最小值。
precompute_distances:是否需要提前計算距離,auto,True,False三個參數(shù)值可選。默認(rèn)值是auto,如果選擇auto,當(dāng)樣本數(shù)*質(zhì)心數(shù)>12兆的時候,就不會提前進(jìn)行計算,如果小于則會與提前計算。提前計算距離會讓聚類速度很快,但是也會消耗很多內(nèi)存。
copy_x:主要起作用于提前計算距離的情況,默認(rèn)值是True,如果是True,則表示在源數(shù)據(jù)的副本上提前計算距離時,不會修改源數(shù)據(jù)。
algorithm:優(yōu)化算法的選擇,有auto、full和elkan三種選擇。full就是一般意義上的K-Means算法,elkan是使用的elkan K-Means算法。默認(rèn)的auto則會根據(jù)數(shù)據(jù)值是否是稀疏的(稀疏一般指是有大量缺失值),來決定如何選擇full和elkan。如果數(shù)據(jù)是稠密的,就選擇elkan K-means,否則就使用普通的Kmeans算法。
對象/屬性
cluster_centers_:輸出聚類的質(zhì)心。
labels_:輸出每個樣本集對應(yīng)的類別。
inertia_:所有樣本點(diǎn)到其最近點(diǎn)距離之和。
層次聚類
層次聚類有兩種方式,一種是從上至下(凝聚法),另一種是從下至上(分裂法),如下圖所示。
從下至上(凝聚法)
從上至下就是把每一個樣本分別當(dāng)作一類,然后計算兩兩樣本之間的距離,將距離較近的兩個樣本進(jìn)行合并,再計算兩兩合并以后的簇之間的距離,將距離最近的兩個簇進(jìn)行合并,重復(fù)執(zhí)行這個過程,直到達(dá)到最后指定的類別數(shù)或者達(dá)到了停止條件。
從上至下(分裂法)
從下至上就是剛開始把所有樣本都當(dāng)作同一類,然后計算兩兩樣本之間的距離,將距離較遠(yuǎn)的兩個樣本分割成兩類,然后再計算剩余樣本集中每個樣本到這兩類中的距離,距離哪類比較近,則把樣本劃分到哪一類,循環(huán)執(zhí)行這個過程,直到達(dá)到最后指定的類別數(shù)或者達(dá)到了停止條件。
參數(shù)
AgglomerativeClustering是用來實(shí)現(xiàn)凝聚法聚類模型的。
class?sklearn.cluster.AgglomerativeClustering(n_clusters=2,?affinity='euclidean',?memory=None,?connectivity=None,?compute_full_tree='auto',?linkage='ward',?pooling_func=<function?mean?at?0x174b938>)n_clusters:目標(biāo)類別數(shù),默認(rèn)是2。
affinity:樣本點(diǎn)之間距離計算方式,可以是euclidean(歐式距離), l1、 l2、manhattan(曼哈頓距離)、cosine(余弦距離)、precomputed(可以預(yù)先設(shè)定好距離),如果參數(shù)linkage選擇“ward”的時候只能使用euclidean。
linkage:鏈接標(biāo)準(zhǔn),即樣本點(diǎn)的合并標(biāo)準(zhǔn),主要有ward、complete、average三個參數(shù)可選,默認(rèn)是ward。每個簇(類)本身就是一個集合,我們在合并兩個簇的時候其實(shí)是在合并兩個集合,所以我們需要找到一種計算兩個集合之間距離的方式,主要有這三種方式:ward、complete、average,分別表示使用兩個集合方差、兩個集合中點(diǎn)與點(diǎn)距離之間的平均值、兩個集合中距離最小的兩個點(diǎn)的距離。
對象/屬性
labels_:每個樣本點(diǎn)的類別。
n_leaves_:層次樹中葉結(jié)點(diǎn)樹。
密度聚類:
密度聚類與前面兩種聚類方式不同,密度聚類無法事先指定類別個數(shù),只能通過去指定每個點(diǎn)的鄰域,以及鄰域內(nèi)包含樣本點(diǎn)的最少個數(shù)。
先來看幾個密度聚類里面用到的概念:
鄰域:鄰域是針對樣本集中的每個點(diǎn)而言的,我們把距離某個樣本點(diǎn)(可以把該點(diǎn)理解為圓心)距離在r(可理解為圓的半徑)以內(nèi)的點(diǎn)的集合稱為該點(diǎn)的鄰域。
核心對象:如果某個點(diǎn)的鄰域內(nèi)至少包含MinPts個樣本,則該點(diǎn)就可以稱為核心對象。
密度直達(dá):如果點(diǎn)A位于點(diǎn)B的鄰域中,且點(diǎn)B是核心對象,則稱A和B是密度直達(dá)。
密度可達(dá):對于點(diǎn)A和B,如果存在一個(或者若干個)點(diǎn)C,其中A到C是密度直達(dá),C到B是密度直達(dá),則A和B就稱為密度可達(dá)。(你可以理解為C是一個跳板,你可以通過C從點(diǎn)A跳到B)
密度相連:若存在一個點(diǎn)C,使得C到A是密度直達(dá),C到B是密度直達(dá),則稱A和B是密度相連的。
具體步驟
先建立幾個集合,一個用來存儲核心對象的集合Ω,初始值是空集;再初始化一個值k,用來存放簇的類別數(shù),初始值為0;再新建一個集合Γ,用來存放未被使用的樣本,初始值為全部樣本集D。
遍歷所有樣本集中的每個樣本點(diǎn)p,判斷其是否滿足核心對象的條件,如果滿足,則把該點(diǎn)加入到核心對象集合Ω中;如果沒有樣本點(diǎn)滿足核心對象條件,則結(jié)束遍歷。
判斷核心對象集合Ω是否為空,如果為空,則算法結(jié)束;如果不為空,則在集合Ω中隨機(jī)選取一個樣本點(diǎn),將該點(diǎn)密度可達(dá)的所有樣本點(diǎn)劃分為一個簇,這個簇的樣本集合稱為Ck ,將簇的類別數(shù)k+1,未被使用樣本Γ-Ck。
4.再在剩余的核心對象中重復(fù)步驟3,直到?jīng)]有核心對象為止。
5.最后輸出k個類別的樣本集合{C1、C2、……、Ck}。
參數(shù)
class?sklearn.cluster.DBSCAN(eps=0.5,?min_samples=5,?metric='euclidean',?metric_params=None,?algorithm='auto',?leaf_size=30,?p=None,?n_jobs=1)eps:即鄰域中的r值,可以理解為圓的半徑。
min_samples:要成為核心對象的必要條件,即鄰域內(nèi)的最小樣本數(shù),默認(rèn)是5個。
metric:距離計算方式,和層次聚類中的affinity參數(shù)類似,同樣也可以是precomputed。
metric_params:其他度量函數(shù)的參數(shù)。
algorithm:最近鄰搜索算法參數(shù),auto、ball_tree(球樹)、kd_tree(kd樹)、brute(暴力搜索),默認(rèn)是auto。
leaf_size:最近鄰搜索算法參數(shù),當(dāng)algorithm使用kd_tree或者ball_tree時,停止建子樹的葉子節(jié)點(diǎn)數(shù)量的閾值。
p: 最近鄰距離度量參數(shù)。只用于閔可夫斯基距離和帶權(quán)重閔可夫斯基距離中p值的選擇,p=1為曼哈頓距離,p=2為歐式距離。
對象/屬性
core_sample_indices_:核心對象數(shù)。
labels_:每個樣本點(diǎn)的對應(yīng)的類別,對于噪聲點(diǎn)將賦值為-1。
你還可以看:
SKlearn參數(shù)詳解—隨機(jī)森林
Sklearn參數(shù)詳解—GBDT
Sklearn參數(shù)詳解—Adaboost
參考文章:
http://www.cnblogs.com/pinard/p/6217852.html
總結(jié)
以上是生活随笔為你收集整理的Sklearn参数详解—聚类算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 618前京东APP 12.0上线,推出“
- 下一篇: 数据结构—字符串