這篇文章主要介紹了python實現鳶尾花三種聚類算法(K-means,AGNES,DBScan),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨着小編來一起學習學習吧
一.分散性聚類(kmeans)
算法流程:
1.選擇聚類的個數k.
2.任意產生k個聚類,然後確定聚類中心,或者直接生成k箇中心。
3.對每個點確定其聚類中心點。
4.再計算其聚類新中心。
5.重複以上步驟直到滿足收斂要求。(通常就是確定的中心點不再改變。
優點:
1.是解決聚類問題的一種經典算法,簡單、快速
2.對處理大數據集,該算法保持可伸縮性和高效率
3.當結果簇是密集的,它的效果較好
缺點
1.在簇的平均值可被定義的情況下才能使用,可能不適用於某些應用
2.必須事先給出k(要生成的簇的數目),而且對初值敏感,對於不同的初始值,可能會導致不同結果。
3.不適合於發現非凸形狀的簇或者大小差別很大的簇
4.對躁聲和孤立點數據敏感
這裏爲了看鳶尾花的三種聚類算法的直觀區別,所以不用具體算法實現,只需要調用相應函數即可。
程序如下:
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] # #表示我們取特徵空間中的4個維度
print(X.shape)
# 繪製數據分佈圖
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) # 構造聚類器
estimator.fit(X) # 聚類
label_pred = estimator.labels_ # 獲取聚類標籤
# 繪製k-means結果
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()
運行結果:
二.結構性聚類(層次聚類)
1.凝聚層次聚類:AGNES算法(自底向上)
首先將每個對象作爲一個簇,然後合併這些原子簇爲越來越大的簇,直到某個終結條件被滿足
2.分裂層次聚類:DIANA算法(自頂向下)
首先將所有對象置於一個簇中,然後逐漸細分爲越來越小的簇,直到達到了某個終結條件。
這裏我選擇的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 ("各個簇的樣本數目:")
print (pd.Series(clustering.labels_).value_counts())
print ("聚類結果:")
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()
運行結果:
推薦我們的Python學習扣qun:913066266 ,看看前輩們是如何學習的!從基礎的python腳本到web開發、爬蟲、django、數據挖掘等【PDF,實戰源碼】,零基礎到項目實戰的資料都有整理。送給每一位python的小夥伴!每天都有大牛定時講解Python技術,分享一些學習的方法和需要注意的小細節,點擊加入我們的 python學習者聚集地
三.密度聚類之DBSCAN算法:
算法:
需要兩個參數:ε (eps) 和形成高密度區域所需要的最少點數 (minPts)
它由一個任意未被訪問的點開始,然後探索這個點的 ε-鄰域,如果 ε-鄰域裏有足夠的點,則建立一個新的聚類,否則這個點被標籤爲雜音。注意這個點之後可能被發現在其它點的 ε-鄰域裏,而該 ε-鄰域可能有足夠的點,屆時這個點會被加入該聚類中。
程序如下:
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個維度
print(X.shape)
# 繪製數據分佈圖
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結果
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()
運行結果:
改變參數後:
四、結果分析
從上面三種實驗截圖可以看出,k-means聚類和AGNES層次聚類分析結果差不多的三類,與DBSCAN的結果不一樣。爲啥不一樣,這就取決於算法本身的優缺點了。
k-means對於大型數據集也是簡單高效、時間複雜度、空間複雜度低。 最重要是數據集大時結果容易局部最優;需要預先設定K值,對最先的K個點選取很敏感;對噪聲和離羣值非常敏感;只用於numerical類型數據;不能解決非凸數據。
DBSCAN對噪聲不敏感;能發現任意形狀的聚類。 但是聚類的結果與參數有很大的關係;DBSCAN用固定參數識別聚類,但當聚類的稀疏程度不同時,相同的判定標準可能會破壞聚類的自然結構,即較稀的聚類會被劃分爲多個類或密度較大且離得較近的類會被合併成一個聚類。