《機器學習》周志華西瓜書習題參考答案:第9章 - 聚類


【機器學習】《機器學習》周志華西瓜書 筆記/習題答案 總目錄

——————————————————————————————————————————————————————

習題

在這里插入圖片描述
回顧一下性質:(《機器學習》周志華西瓜書學習筆記(九):聚類
在這里插入圖片描述
非負性、同一性、對稱性很顯然都是符合的,關鍵是直遞性了,關於直遞性就是閔可夫斯基不等式的證明,具體參考:閔可夫斯基不等式

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

  • 非負性 d i s t h ( X , Z ) = max x X min z Z x z 2 0 dist_h(X,Z)=\max_{x\in X}\min_{z\in Z}\Vert x-z\Vert_2\geq0 ,所以 d i s t H ( X , Z ) 0 dist_H(X,Z)\geq0 。若 d i s t h ( Z , X ) d i s t H ( X , Z ) dist_h(Z,X) \geq dist_H(X,Z) ,則兩個都大於0, m a x max 時最后結果大於0,否則小於0, m a x max 時最后結果還是大於0;
  • 同一性: 假設 x i z i x_i\ne z_i ,其他的樣本都完全相同時,那么對於 x j , j = 1 , 2 , . . i 1 , i , . . . , n x_j,j=1, 2,..i-1, i,...,n 都有 z j z_j 使得 min z Z x j z 2 = 0 \min_{z\in Z}\Vert x_j-z\Vert_2=0 ,而對於 x i x_i ,由於沒有相同的樣本,所以 min z Z x i z 2 > 0 max x X min z Z x z 2 > 0 \min_{z\in Z}\Vert x_i-z\Vert_2>0\Rightarrow \max_{x\in X}\min_{z\in Z}\Vert x-z\Vert_2>0 ,當且僅當相等時成立;
  • 對稱性 d i s t H ( X , Z ) = max ( d i s h h ( X , Z ) , d i s t h ( Z , X ) ) = max ( d i s t h ( Z , X ) d i s h h ( X , Z ) ) = d i s t H ( Z , X ) dist_H(X,Z)=\max(dish_h(X,Z),dist_h(Z,X))=\max(dist_h(Z,X),dish_h(X,Z))=dist_H(Z,X)
  • 直遞性:暫時不會。。。。。。

在這里插入圖片描述
在這里插入圖片描述
不能,因為 k 均值本身是 NP 問題,而且 9.24 是非凸的(具體證明不太懂),容易陷入局部最優,所以在使用 k 均值時常常多次隨機初始化中心點,然后在中心點附近挑選結果最好的一個,即局部最優解,無法找到全局最優解。

在這里插入圖片描述
代碼如下:

import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import ConvexHull


class KMeans(object):
    def __init__(self, k):
        self.k = k

    def fit(self, X, initial_centroid_index=None, max_iters=10, seed=16, plt_process=False):
        m, n = X.shape
        # 沒有指定中心點時,隨機初始化中心點
        if initial_centroid_index is None:
            np.random.seed(seed)
            initial_centroid_index = np.random.randint(0, m, self.k)
        centroid = X[initial_centroid_index, :]
        idx = None

        # 打開交互模式
        plt.ion()
        for i in range(max_iters):
            # 按照中心點給樣本分類
            idx = self.find_closest_centroids(X, centroid)
            if plt_process:
                self.plot_converge(X, idx, initial_centroid_index)
            # 重新計算中心點
            centroid = self.compute_centroids(X, idx)
        # 關閉交互模式
        plt.ioff()
        plt.show()
        return centroid, idx

    def find_closest_centroids(self, X, centroid):
        # 這種方式利用 numpy 的廣播機制,直接計算樣本到各中心的距離,不用循環,速度比較快,但是在樣本比較大時,更消耗內存
        distance = np.sum((X[:, np.newaxis, :] - centroid) ** 2, axis=2)
        idx = distance.argmin(axis=1)
        return idx

    def compute_centroids(self, X, idx):
        centroids = np.zeros((self.k, X.shape[1]))
        for i in range(self.k):
            centroids[i, :] = np.mean(X[idx == i], axis=0)
        return centroids

    def plot_converge(self, X, idx, initial_idx):
        plt.cla() # 清除原有圖像
        plt.title("k-meas converge process")
        plt.xlabel('density')
        plt.ylabel('sugar content')
        plt.scatter(X[:, 0], X[:, 1], c='lightcoral')
        # 標記初始化中心點
        plt.scatter(X[initial_idx, 0], X[initial_idx, 1], label='initial center', c='k')
        # 畫出每個簇的凸包
        for i in range(self.k):
            X_i = X[idx == i]
            # 獲取當前簇的凸包索引
            hull = ConvexHull(X_i).vertices.tolist()
            hull.append(hull[0])
            plt.plot(X_i[hull, 0], X_i[hull, 1], 'c--')
        plt.legend()
        plt.pause(0.5)


if __name__ == '__main__':
    data = np.loadtxt('..\data\watermelon4_0_Ch.txt', delimiter=', ')
    centroid, idx = KMeans(3).fit(data, plt_process=True, seed=24)

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
證明如下:

連接性: 由於任意 x D x^{'} \in D 都由 x x 密度可達,於是任意 x i , x j D x_i,x_j\in D 都可通過 x x 密度相連;

最大性: x i D x i x_i \in D\Rightarrow x_i x x 密度可達,又 x j x_j x i x_i 密度可達 x j \Rightarrow x_j x x 密度可達 x j D \Rightarrow x_j \in D

在這里插入圖片描述
最小距離由兩個簇的最近樣本決定,最大距離由兩個簇的最遠樣本決定。具體區別如下:

  • 最大距離,可以認為是所有類別首先生成一個能包圍所有類內樣本的最小圓,然后所有圓同時慢慢擴大相同的半徑,直到某個類圓能完全包圍另一個類的所有點就停止,並合並這兩個類。由於此時的圓已經包含另一個類的全部樣本,所以稱為全連接。

  • 最小距離,可以認為是擴大時遇到第一個非自己類的點就停止,並合並這兩個類。由於此時的圓只包含另一個類的一個點,所以稱為單連接。

在這里插入圖片描述

  • 原型聚類:輸出線性分類邊界的聚類算法顯然都是凸聚類,這樣的算法有:K均值,LVQ;而曲線分類邊界的也顯然是非凸聚類,高斯混合聚類,在簇間方差不同時,其決策邊界為弧線,所以高混合聚類為非凸聚類;
  • 密度聚類:DBSCAN是非凸聚類;
  • 層次聚類:AGENS是凸聚類。

在這里插入圖片描述
暫無待補

在這里插入圖片描述
樣本 x i , x j x_i,x_j 的距離為: d ( x i , x j ) = n = 1 N δ i j n d i j n n = 1 N δ i j n d(x_i,x_j)=\frac{\sum_{n=1}^{N}\delta^n_{ij}d^n_{ij}}{\sum_{n=1}^{N}\delta^n_{ij}} ,其中當 x i n , x j n x_{in},x_{jn} 缺失時, δ i j n = 0 \delta^n_{ij}=0 ,其他情況為1;

  • 當前屬性 n n 為數值類型時, d i j n = x i n x j n max ( X ) min ( X ) d^n_{ij} =\frac{\left| x_{in}-x_{jn} \right|}{\max(X)-\min(X)}
  • 當前屬性 n n 為類別型或二元型時, x i n = x j n x_{in}=x_{jn} 時, d i j n = 1 d_{ij}^n=1 ,否則為 0 ;
  • 當前屬性 n n 為序數型時,即 x i n [ 1 , 2 , . . . , M n ] x_{in}\in[1, 2,...,M_n] ,先將其歸一化, z i n = x i n 1 M n 1 z_{in} = \frac {x_{in}-1}{M_n -1} ,然后將 z i n z_{in} 作為數值屬性來處理。

這里的計算其實很簡單,就是把連續屬性歸一化;而離散屬性有序時則歸一化,再按照連續屬性處理,無序時則相等為 1 ,不等為 0。

參考:《數據挖掘概念與技術》韓家煒,2.4節

在這里插入圖片描述
《X-meas: Extending K-means with Efficient Estimation of the Number of Clusters》給出了一個自動確定 k 值的方法。

參考文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM