華盛頓大學 機器學習 筆記。算法
k-means的侷限性app
k-means 是一種硬分類(hard assignment)方法,例如對於文檔分類問題,k-means會精確地指定某一文檔歸類到某一個主題,但不少時候硬分類並不能徹底描述這個文檔的性質,這個文檔的主題是混合的,這時候須要軟分類(soft assignment)模型。機器學習
k-means 缺陷:(1)只關注聚類中心的表現。(2)聚類區域形狀必須爲對稱圓形/球形,軸平行。函數
對於聚類區域大小不1、軸不平行、聚類空間重疊等狀況,k-means 缺陷顯著。
學習
混合模型的優勢:spa
1.軟分類(例如,主題 54%「世界新聞」,45% 「科學」, 1% 「體育」)3d
2.關注聚類區域形狀而不僅是中心code
3.每一個聚類的權重(weights)可學習blog
高斯混合模型(GMM)文檔
(1) 高斯函數描述聚類分佈
高斯混合模型假定每一個聚類能夠用一個高斯分佈函數N(x|μ ,Σ)描述,如圖
描述聚類的參數有三個, { π, μ , Σ },其中,π 爲聚類 的權重(weight),μ爲 聚類的平均值(mean),Σ 爲聚類的協方差(covariance).
高斯混合模型機率分佈:
如何理這個解機率分佈模型,以計算點xi屬於聚類k的機率爲例。
(2)如何計算點 xi 屬於聚類k 的機率?
貝葉斯公式:
假設從數據集中隨機抽取一個數據點,考慮如下幾種狀況:
A = 抽到的點屬於聚類k
B = 抽到點xi
B|A = 已知抽取的點屬於聚類k 中, 抽到點xi
A|B = 已知抽到點xi, 抽取的點屬於聚類k
P(A|B)其實等價於」點xi屬於聚類k」的機率。
接下來求P(A)、P(B)、P(B|A),經過貝葉斯公式可求P(A|B)。
A = 抽到的點屬於聚類k
P(A):從數據集中隨機抽取一個點,剛好抽到聚類k中的點的機率。
(其中,全部聚類權重之和爲1,即
,m爲聚類數量)
即
B|A = 已知抽取的點屬於聚類k,中, 抽到點xi
P(B|A):轉換爲從聚類k中隨機抽一個點,剛好抽到點xi的機率。
GMM模型假設每一個聚類中數據點服從高斯分佈:
即
B = 抽到點xi
P(B):從數據集中隨機抽取一個點,剛好抽到點xi的機率。
這種狀況下,抽到的點歸屬於哪一個/些聚類未知,考慮到:
若是已知抽到的點屬於哪些聚類,這個機率能夠按照P(B|A)的公式算。
從數據集中隨機抽點,抽到的點屬於某個聚類的機率,能夠按照P(A)的公式計算。
使用用條件機率公式計算:
這就是就是GMM模型的機率分佈模型。
點xi屬於聚類k的機率,即後驗機率爲:
即
(3)評估GMM模型優劣的方法——似然性
首先明確隱變量:
假設整個數據集是從符合這個GMM模型的大樣本中隨機抽取點構成的,每次抽取的數據記爲 xi(i = 1,2,…,N, 數據集中一共N個點),對於第i次抽取的點,此時xi是已知的,而 xi屬於哪一個聚類未知,以隱變量γ表示,其中
γ爲隨機變量。則變量的徹底數據爲
似然函數表示的是,在當前GMM模型的參數下,以上述方法造成的數據集,剛好構成了本來的數據集的機率。
似然函數計算式:
其中多維高斯分佈函數(維數爲dim):
實際應用中經常使用對數似然函數:
EM算法
EM算法(expectation maximization, 指望最大化),計算GMM模型分兩步:
1. E- step: 根據當前GMM模型的參數,計算(estimate)對數似然性的指望值。
2. M-step: 求使似然性(likelihood)指望最大的新的模型參數。
E-step:
對數似然性表達式:
求指望要先明確一件事,隨機變量是什麼?
隱變量γ
即
隱變量的指望稱爲聚類k對xi的響應度(responsibility)。記爲
考慮到表示的意義是,xi是否屬於聚類k。所以
的指望就是在當前模型參數下,xi屬於聚類k的機率,即
帶入原式得:
def log_sum_exp(Z): """ Compute log(\sum_i exp(Z_i)) for some array Z.""" return np.max(Z) + np.log(np.sum(np.exp(Z - np.max(Z)))) def loglikelihood(data, weights, means, covs): """ Compute the loglikelihood of the data for a Gaussian mixture model. """ num_clusters = len(means) num_dim = len(data[0]) num_data = len(data) resp = compute_responsibilities(data, weights, means, covs) log_likelihood = 0 for k in range(num_clusters): Z = np.zeros(num_clusters) for i in range(num_data): # Compute (x-mu)^T * Sigma^{-1} * (x-mu) delta = np.array(data[i]) - means[k] exponent_term = np.dot(delta.T, np.dot(np.linalg.inv(covs[k]), delta)) Z[k] += np.log(weights[k]) Z[k] -= 1/2. * (num_dim * np.log(2*np.pi) + np.log(np.linalg.det(covs[k])) + exponent_term) Z[k] = resp[i][k]* Z[k] log_likelihood += log_sum_exp(Z) return log_likelihood
M-step:
求使似然性指望最大的新的模型參數。似然性指望的公式:
用這個式子分別對 { π, μ , Σ }這幾個參數求偏導數,並令偏導數爲0,便可獲得新的模型參數。
聚類k的新參數計算:
EM是一種 座標上升(coordinate-ascent)算法,屢次迭代直到對數似然函數的值再也不有明顯變化,獲得局部最優解。
def EM(data, init_means, init_covariances, init_weights, maxiter=1000, thresh=1e-4): # Initialize means = init_means[:] covariances = init_covariances[:] weights = init_weights[:] num_data = len(data) num_dim = len(data[0]) num_clusters = len(means) resp = np.zeros((num_data, num_clusters)) log_likelihood = loglikelihood(data, weights, means, covariances) ll_trace = [log_likelihood] for it in range(maxiter): # E-step: resp = compute_responsibilities(data, weights, means, covariances) # M-step: # 更新 n(k),weight(k),mean(k),covariances(k) counts = compute_counts(resp) weights = compute_weights(counts) means = compute_means(data, resp, counts) covariances = compute_covariances(data, resp, counts, means) # 計算這次迭代以後的log likelihood ll_latest = loglikelihood(data, weights, means, covariances) ll_trace.append(ll_latest) # 收斂? if (ll_latest - log_likelihood) < thresh and ll_latest > -np.inf: break log_likelihood = ll_latest model = {'weights': weights, 'means': means, 'covs': covariances, 'loglik': ll_trace, 'resp': resp} return model