您好,登錄后才能下訂單哦!
一.分散性聚類(kmeans)
算法流程:
1.選擇聚類的個(gè)數(shù)k.
2.任意產(chǎn)生k個(gè)聚類,然后確定聚類中心,或者直接生成k個(gè)中心。
3.對(duì)每個(gè)點(diǎn)確定其聚類中心點(diǎn)。
4.再計(jì)算其聚類新中心。
5.重復(fù)以上步驟直到滿足收斂要求。(通常就是確定的中心點(diǎn)不再改變。
優(yōu)點(diǎn):
1.是解決聚類問題的一種經(jīng)典算法,簡(jiǎn)單、快速
2.對(duì)處理大數(shù)據(jù)集,該算法保持可伸縮性和高效率
3.當(dāng)結(jié)果簇是密集的,它的效果較好
缺點(diǎn)
1.在簇的平均值可被定義的情況下才能使用,可能不適用于某些應(yīng)用
2.必須事先給出k(要生成的簇的數(shù)目),而且對(duì)初值敏感,對(duì)于不同的初始值,可能會(huì)導(dǎo)致不同結(jié)果。
3.不適合于發(fā)現(xiàn)非凸形狀的簇或者大小差別很大的簇
4.對(duì)躁聲和孤立點(diǎn)數(shù)據(jù)敏感
這里為了看鳶尾花的三種聚類算法的直觀區(qū)別,所以不用具體算法實(shí)現(xiàn),只需要調(diào)用相應(yīng)函數(shù)即可。
程序如下:
import matplotlib.pyplot as plt import numpy as np from sklearn.cluster import KMeans from sklearn import datasets iris = datasets.load_iris() X = iris.data[:, :4] # #表示我們?nèi)√卣骺臻g中的4個(gè)維度 print(X.shape) # 繪制數(shù)據(jù)分布圖 plt.scatter(X[:, 0], X[:, 1], c="red", marker='o', label='see') plt.xlabel('sepal length') plt.ylabel('sepal width') plt.legend(loc=2) plt.show() estimator = KMeans(n_clusters=3) # 構(gòu)造聚類器 estimator.fit(X) # 聚類 label_pred = estimator.labels_ # 獲取聚類標(biāo)簽 # 繪制k-means結(jié)果 x0 = X[label_pred == 0] x1 = X[label_pred == 1] x2 = X[label_pred == 2] plt.scatter(x0[:, 0], x0[:, 1], c="red", marker='o', label='label0') plt.scatter(x1[:, 0], x1[:, 1], c="green", marker='*', label='label1') plt.scatter(x2[:, 0], x2[:, 1], c="blue", marker='+', label='label2') plt.xlabel('sepal length') plt.ylabel('sepal width') plt.legend(loc=2) plt.show()
運(yùn)行結(jié)果:
二.結(jié)構(gòu)性聚類(層次聚類)
1.凝聚層次聚類:AGNES算法(自底向上)
首先將每個(gè)對(duì)象作為一個(gè)簇,然后合并這些原子簇為越來越大的簇,直到某個(gè)終結(jié)條件被滿足
2.分裂層次聚類:DIANA算法(自頂向下)
首先將所有對(duì)象置于一個(gè)簇中,然后逐漸細(xì)分為越來越小的簇,直到達(dá)到了某個(gè)終結(jié)條件。
這里我選擇的AGNES算法。
程序如下:
from sklearn import datasets from sklearn.cluster import AgglomerativeClustering import matplotlib.pyplot as plt from sklearn.metrics import confusion_matrix import pandas as pd iris = datasets.load_iris() irisdata = iris.data clustering = AgglomerativeClustering(linkage='ward', n_clusters=3) res = clustering.fit(irisdata) print ("各個(gè)簇的樣本數(shù)目:") print (pd.Series(clustering.labels_).value_counts()) print ("聚類結(jié)果:") print (confusion_matrix(iris.target, clustering.labels_)) plt.figure() d0 = irisdata[clustering.labels_ == 0] plt.plot(d0[:, 0], d0[:, 1], 'r.') d1 = irisdata[clustering.labels_ == 1] plt.plot(d1[:, 0], d1[:, 1], 'go') d2 = irisdata[clustering.labels_ == 2] plt.plot(d2[:, 0], d2[:, 1], 'b*') plt.xlabel("Sepal.Length") plt.ylabel("Sepal.Width") plt.title("AGNES Clustering") plt.show()
運(yùn)行結(jié)果:
三.密度聚類之DBSCAN算法:
算法:
需要兩個(gè)參數(shù):ε (eps) 和形成高密度區(qū)域所需要的最少點(diǎn)數(shù) (minPts)
它由一個(gè)任意未被訪問的點(diǎn)開始,然后探索這個(gè)點(diǎn)的 ε-鄰域,如果 ε-鄰域里有足夠的點(diǎn),則建立一個(gè)新的聚類,否則這個(gè)點(diǎn)被標(biāo)簽為雜音。注意這個(gè)點(diǎn)之后可能被發(fā)現(xiàn)在其它點(diǎn)的 ε-鄰域里,而該 ε-鄰域可能有足夠的點(diǎn),屆時(shí)這個(gè)點(diǎn)會(huì)被加入該聚類中。
程序如下:
import matplotlib.pyplot as plt import numpy as np from sklearn.cluster import KMeans from sklearn import datasets from sklearn.cluster import DBSCAN iris = datasets.load_iris() X = iris.data[:, :4] # #表示我們只取特征空間中的4個(gè)維度 print(X.shape) # 繪制數(shù)據(jù)分布圖 plt.scatter(X[:, 0], X[:, 1], c="red", marker='o', label='see') plt.xlabel('sepal length') plt.ylabel('sepal width') plt.legend(loc=2) plt.show() dbscan = DBSCAN(eps=0.4, min_samples=9) dbscan.fit(X) label_pred = dbscan.labels_ # 繪制k-means結(jié)果 x0 = X[label_pred == 0] x1 = X[label_pred == 1] x2 = X[label_pred == 2] plt.scatter(x0[:, 0], x0[:, 1], c="red", marker='o', label='label0') plt.scatter(x1[:, 0], x1[:, 1], c="green", marker='*', label='label1') plt.scatter(x2[:, 0], x2[:, 1], c="blue", marker='+', label='label2') plt.xlabel('sepal length') plt.ylabel('sepal width') plt.legend(loc=2) plt.show()
運(yùn)行結(jié)果:
改變參數(shù)后:
四、結(jié)果分析
從上面三種實(shí)驗(yàn)截圖可以看出,k-means聚類和AGNES層次聚類分析結(jié)果差不多的三類,與DBSCAN的結(jié)果不一樣。為啥不一樣,這就取決于算法本身的優(yōu)缺點(diǎn)了。
k-means對(duì)于大型數(shù)據(jù)集也是簡(jiǎn)單高效、時(shí)間復(fù)雜度、空間復(fù)雜度低。 最重要是數(shù)據(jù)集大時(shí)結(jié)果容易局部最優(yōu);需要預(yù)先設(shè)定K值,對(duì)最先的K個(gè)點(diǎn)選取很敏感;對(duì)噪聲和離群值非常敏感;只用于numerical類型數(shù)據(jù);不能解決非凸數(shù)據(jù)。
DBSCAN對(duì)噪聲不敏感;能發(fā)現(xiàn)任意形狀的聚類。 但是聚類的結(jié)果與參數(shù)有很大的關(guān)系;DBSCAN用固定參數(shù)識(shí)別聚類,但當(dāng)聚類的稀疏程度不同時(shí),相同的判定標(biāo)準(zhǔn)可能會(huì)破壞聚類的自然結(jié)構(gòu),即較稀的聚類會(huì)被劃分為多個(gè)類或密度較大且離得較近的類會(huì)被合并成一個(gè)聚類。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。