一、K-Means
K-Means是GMM的特例(硬聚類,基于原型的聚類),假設多元高斯分布的協方差為0,方差相同, K-Means演算法思想 對于給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為K個簇,讓簇內的點盡量緊密的連在一起,而讓簇間的距離盡量的大,
N個d維樣本,時間復雜度 O(kLNd)
- 初始K個類(簇心)
- E步:對每個樣本,計算到K個類的歐式距離,并分配類標簽 O(kNd)
- M步:基于類內的樣本,以樣本均值更新類(均值最小化,類到類內樣本的誤差) O(Nd)
- 重復2-3步,直到聚類結果不變化或收斂
# 基于Cursor生成的代碼 import numpy as np def k_means(X, k, max_iters=100): # randomly initialize centroids centroids = X[np.random.choice(range(len(X)), k, replace=False)] for i in range(max_iters): # calculate distances between each point and each centroid distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2)) # assign each point to the closest centroid labels = np.argmin(distances, axis=0) # update centroids to be the mean of the points assigned to them for j in range(k): centroids[j] = X[labels == j].mean(axis=0) return centroids, labels d = 3 k = 3 X = np.random.rand(100, 3) centroids, labels = k_means(X, k, max_iters=100) import matplotlib.pyplot as plt fig = plt.figure(figsize=(10, 7)) ax = fig.add_subplot(111, projection='3d') ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=labels, cmap='viridis') ax.scatter(centroids[:, 0], centroids[:, 1], centroids[:, 2], marker='*', s=300, c='r') ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label') plt.show()
二、GMM
?斯分布的線性組合可以給出相當復雜的概率密度形式, 通過使??夠多的?斯分布,并且調節它們的均值和?差以及線性組合的系數,?乎所有的連續概率密度都能夠以任意的精度近似,
對3個高斯分布的概率密度函式進行加權,考慮K個?斯概率密度的疊加,形式為:
混合?斯(mixture of Gaussians),每?個?斯概率密度N (x | μk, Σk)被稱為混合分布的?個成分(component),并且有??的均值μk和協?差Σk,
具有3個成分的混合?斯分布的輪廓線,引數πk被稱為混合系數,GMM
可把πk = p(k)看成選擇第k個成分的先驗概率, 把 密度N (x | μk, Σk) = p(x | k)看成以k為條件的x的概率,
?斯混合分布的形式由引數π, μ和Σ控制,其中令π ≡ {π1, . . . , πK}, μ ≡
{μ1, . . . , μK}且Σ ≡ {Σ1, . . . , Σk},?種確定這些引數值的?法是使?最?似然法,根據公式),對數似然函式為:
因為對數中存在?個求和式,導致引數的最?似然解不再有?個封閉形式的決議解:
- ?種最?化這個似然函式的?法是使?迭代數值優化?法,
- 另?種是使?EM期望最?化演算法(對包含隱變數的似然進行迭代優化),
- 期望:根據引數,更新樣本關于類的回應度(隸屬度,相當于分別和K個類計算距離并歸一化),確定回應度,就可以確定EM演算法的Q函式(完全資料的對數似然關于 分布的期望),原始似然的下界,
- 最大化:根據回應度,計算均值、方差,
import numpy as np from sklearn import datasets import matplotlib.pyplot as plt from sklearn.mixture import GaussianMixture from sklearn.cluster import KMeans # 創建資料,并可視化 X, y = datasets.make_blobs(n_samples=1500, cluster_std=[1.0, 2.5, 0.5], random_state=170) plt.figure(figsize=(12,4)) plt.rcParams['font.family'] = 'STKaiti' plt.rcParams['font.size'] = 20 plt.subplot(1,3,1) plt.scatter(X[:,0],X[:,1],c = y) plt.title('原始資料',pad = 20)Kmeans聚類
kmeans = KMeans(3) kmeans.fit(X) y_ = kmeans.predict(X) plt.subplot(1,3,2) plt.scatter(X[:,0],X[:,1],c = y_) plt.title('KMeans聚類效果',pad = 20)GMM高斯混合模型聚類
gmm = GaussianMixture(n_components=3) y_ = gmm.fit_predict(X) plt.subplot(1,3,3) plt.scatter(X[:,0],X[:,1],c = y_) plt.title('GMM聚類效果',pad = 20) plt.figtext(x = 0.51,y = 1.1,s = 'KMeans VS GMM',ha = 'center',fontsize = 30) plt.savefig('./GMM高斯混合模型.png',dpi = 200)
優點:
- 可以完成大部分形狀的聚類
- 大資料集時,對噪聲資料不敏感
- 對于距離或密度聚類,更適合高維特征
- 計算復雜高,速度較慢
- 難以對圓形資料聚類
- 需要在測驗前知道類別的個數(成分個數,超引數)
- 初始化引數會對聚類結果產生影響
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/550263.html
標籤:其他
