【機器學習】《機器學習》周志華西瓜書 筆記/習題答案 總目錄
——————————————————————————————————————————————————————
習題
回顧一下性質:(《機器學習》周志華西瓜書學習筆記(九):聚類)
非負性、同一性、對稱性很顯然都是符合的,關鍵是直遞性了,關於直遞性就是閔可夫斯基不等式的證明,具體參考:閔可夫斯基不等式。
- 非負性: ,所以 。若 ,則兩個都大於0, 時最后結果大於0,否則小於0, 時最后結果還是大於0;
- 同一性: 假設 ,其他的樣本都完全相同時,那么對於 都有 使得 ,而對於 ,由於沒有相同的樣本,所以 ,當且僅當相等時成立;
- 對稱性: ;
- 直遞性:暫時不會。。。。。。
不能,因為 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)
證明如下:
連接性: 由於任意 都由 密度可達,於是任意 都可通過 密度相連;
最大性: 由 密度可達,又 由 密度可達 由 密度可達 。
最小距離由兩個簇的最近樣本決定,最大距離由兩個簇的最遠樣本決定。具體區別如下:
-
最大距離,可以認為是所有類別首先生成一個能包圍所有類內樣本的最小圓,然后所有圓同時慢慢擴大相同的半徑,直到某個類圓能完全包圍另一個類的所有點就停止,並合並這兩個類。由於此時的圓已經包含另一個類的全部樣本,所以稱為全連接。
-
最小距離,可以認為是擴大時遇到第一個非自己類的點就停止,並合並這兩個類。由於此時的圓只包含另一個類的一個點,所以稱為單連接。
- 原型聚類:輸出線性分類邊界的聚類算法顯然都是凸聚類,這樣的算法有:K均值,LVQ;而曲線分類邊界的也顯然是非凸聚類,高斯混合聚類,在簇間方差不同時,其決策邊界為弧線,所以高混合聚類為非凸聚類;
- 密度聚類:DBSCAN是非凸聚類;
- 層次聚類:AGENS是凸聚類。
暫無待補
樣本
的距離為:
,其中當
缺失時,
,其他情況為1;
- 當前屬性 為數值類型時, ;
- 當前屬性 為類別型或二元型時, 時, ,否則為 0 ;
- 當前屬性 為序數型時,即 ,先將其歸一化, ,然后將 作為數值屬性來處理。
這里的計算其實很簡單,就是把連續屬性歸一化;而離散屬性有序時則歸一化,再按照連續屬性處理,無序時則相等為 1 ,不等為 0。
參考:《數據挖掘概念與技術》韓家煒,2.4節
《X-meas: Extending K-means with Efficient Estimation of the Number of Clusters》給出了一個自動確定 k 值的方法。