利用GMM對鳶尾花聚類

2021-10-08 23:43:28 字數 3851 閱讀 1331

參考資料

本次聚類實驗仍然選取鳶尾花資料集(

資料報含5列,分別是花萼長度、花萼寬度、花瓣長度、花瓣寬度、鳶尾花種類。

鳶尾花屬種類包含三種:iris-setosa, iris-versicolour, iris-virginica。

鳶尾花的種類不參與聚類,最後用於計算準確率作為聚類效果的評價

每一類分別是50條,共150條資料;每一類在四個屬性的分布情況如下圖所示

聚類前拿前三個特徵視覺化(四個特徵沒法畫),可以看到區分度還是很明顯的

高斯混合模型(gmm)是假設資料是由n個高斯分布取樣所得到的,並不知道每個資料是來自哪個高斯分布,均有概率來自不同的高斯分布,資料來自每個模型的概率即為隱變數。這是含有隱變數的概率模型,故採用em演算法求解,流程如下:

由於初始化高斯分布是隨機生成的,可能會導致最後效果不好或者迭代很慢,考慮使用k-means聚類作為gmm的初始分布,可以加速收斂速度和提高聚類效果。

k-means生成模型初始引數

利用k-means聚為n類,根據n類資料估計這n個高斯分布的引數作為初始高斯分布

def

get_init_param

(self, data)

:#k-means聚類來生成初始高斯分布

kmeans = kmeans(n_clusters=self.k)

.fit(data)

clusters = defaultdict(

list

)for index, label in

enumerate

(kmeans.labels_)

: clusters[label]

mu =

alpha =

sigma =

for indexs in clusters.values():

partial_data = data[indexs]

#本次高斯分布的均值向量(共d個特徵)0)

)#本次高斯分布的權重

len(indexs)

/ self.n)

#本次高斯分布的協方差(d個特徵間)

) self.mu = np.array(mu)

self.alpha = np.array(alpha)

self.sigma = np.array(sigma)

return

em演算法迭代訓練

利用上面的k-means得到的引數初始化gmm模型引數,接著進行em演算法迭代訓練,基本思想是根據目前的各類高斯分布引數重新計算每組資料所屬各類的概率,取最大概率的類為所屬類;進而根據各類資料重新估計高斯分布引數並更新,迴圈以上步驟,直至似然函式收斂,訓練結束。

def

fit(self, data)

:# 迭代訓練

self.init_param(data)

step =

0 gamma_all_arr =

none

while step < self.maxstep:

step +=

1 old_alpha = copy.copy(self.alpha)

# e步

gamma_all =

# 依次求每個樣本對k個分模型的響應度

for j in

range

(self.n)

: gamma_j =

for k in

range

(self.k):*

self._phi(data[j]

,self.mu[k]

,self.sigma[k]))

s =sum(gamma_j)

gamma_j =

[item/s for item in gamma_j]

gamma_all_arr = np.array(gamma_all)

# m步

for k in

range

(self.k)

: gamma_k = gamma_all_arr[

:, k]

sum = np.

sum(gamma_k)

# 更新權重

self.alpha[k]

= sum / self.n

# 更新均值向量, 1*d

new_mu =

sum(

[gamma * y for gamma, y in

zip(gamma_k, data)])

/ sum

self.mu[k]

= new_mu

# 更新協方差陣, n*d

delta_ = data - new_mu

# d*d

self.sigma[k]

=sum

([gamma*

(np.outer(np.transpose(

[delta]

), delta)

)for gamma, delta in

zip(gamma_k, delta_)])

/ sum

alpha_delta = self.alpha - old_alpha

if np.linalg.norm(alpha_delta,1)

< self.epsilon:

break

self.gamma_all_final = gamma_all_arr

return

模型**

經過em演算法迭代訓練後,得到各個高斯分布的引數,計算每組資料求屬於這n個高斯分布的概率,取概率最大的為該組資料最終聚類的類別

def predict(self):

#應用模型對資料聚類

pre_label=

for j in range(self.n):

max_ind = np.argmax(self.gamma_all_final[j])

return pre_label

模型聚類效果

以上過程詳細**見附件gmm_cluster.py

根據聚類後的資料,依然用鳶尾花資料集的前三個特徵視覺化

利用k-means初始化來定義子模型的概率及生成高斯分布的引數,進而利用em演算法迭代訓練的gmm聚類演算法最終用原鳶尾花資料集的標籤計算得到96.67%的準確率,說明效果很好。

繪製混淆矩陣檢視各類資料利用gmm模型聚類的情況:

利用python實現高斯混合模型(gmm)

聚類——高斯混合模型及em演算法以及python實現

Kmeans 鳶尾花聚類

plt.title 鳶尾花 plt.show def main k 4print ing iris data load iris data iris data.data model kmeans n clusters k model.fit data clustercenter model.clus...

利用KNN對鳶尾花資料進行分類

knn k nearest neighbor 工作原理 存在乙個樣本資料集合,也稱為訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類對應的關係。輸入沒有標籤的資料後,將新資料中的每個特徵與樣本集中資料對應的特徵進行比較,提取出樣本集中特徵最相似資料 最近鄰 的分類標籤...

三類鳶尾花

matlab自帶分類資料集fisheriris,於 中的risi資料,其資料類別分為3類,setosa,versicolor,virginica.每類植物有50個樣本,共150個。每個樣本有4個屬性,分別為花萼長,花萼寬,花瓣長,花瓣寬。首先在matlab中載入資料,如下,其中meas 3 4 相當...