retrival and clustering : week 4 GMM & EM 筆記
華盛頓大學 機器學習 筆記。
k-means的局限性
k-means 是一種硬分類(hard assignment)方法,例如對於文檔分類問題,k-means會精確地指定某一文檔歸類到某一個主題,但很多時候硬分類並不能完全描述這個文檔的性質,這個文檔的主題是混合的,這時候需要軟分類(soft assignment)模型。
k-means 缺陷:(1)只關註聚類中心的表現。(2)聚類區域形狀必須為對稱圓形/球形,軸平行。
對於聚類區域大小不一、軸不平行、聚類空間重疊等情況,k-means 缺陷顯著。
混合模型的優點:
1.軟分類(例如,主題 54%“世界新聞”,45% “科學”, 1% “體育”)
2.關註聚類區域形狀而不只是中心
3.每個聚類的權重(weights)可學習
高斯混合模型(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,即
即
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
retrival and clustering : week 4 GMM & EM 筆記