1. 程式人生 > >retrival and clustering : week 4 GMM & EM 筆記

retrival and clustering : week 4 GMM & EM 筆記

精確 因此 mage 多次 col 局限性 一個點 隨機 很多

華盛頓大學 機器學習 筆記。

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,即 技術分享圖片

,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

retrival and clustering : week 4 GMM & EM 筆記