阿摩線上測驗 登入

申論題資訊

試卷:112年 - 112 專技高考_資訊技師:資料結構與資料庫及資料探勘#117644
科目:資料結構與資料庫及資料探勘
年份:112年
排序:0

申論題內容

五、請寫出群集分析(ClusterAnalysis)的K-means演算法。(20分)
假設輸入有:
D:有n個樣本(Sample)的資料集。
K:欲得到的群集(Cluster)數量。

詳解 (共 1 筆)

詳解 提供者:hchungw

K-means演算法是一種廣泛使用的聚類分析(Cluster Analysis)方法,旨在將n個樣本劃分為K個聚類,每個樣本屬於與其最近的均值(聚類中心)對應的聚類。下面是K-means演算法的基本步驟:
初始化:隨機選擇K個樣本作為初始聚類中心。
分配步驟:對於資料集中的每一個樣本,計算其與每個聚類中心的距離,並將其分配給最近的聚類中心所對應的聚類。
更新步驟:更新每個聚類的中心,使其成為該聚類所有樣本的均值。
反覆運算:重複步驟2和步驟3,直到聚類不再發生變化或達到預定的反覆運算次數。
下面是使用Python實現的K-means演算法的簡化版本:
python
Copy code
import numpy as np
def k_means(D, K, max_iters=100):
    n = len(D)  # 資料集中的樣本數量
    # 隨機初始化聚類中心
    indices = np.random.choice(n, K, replace=False)
    centroids = D[indices]
    
    for _ in range(max_iters):
        # 分配步驟
        clusters = [[] for _ in range(K)]
        for xi in D:
            # 計算樣本與每個聚類中心的距離
            distances = np.linalg.norm(xi - centroids, axis=1)
            # 分配到最近的聚類
            cluster_index = np.argmin(distances)
            clusters[cluster_index].append(xi)
        
        # 更新步驟
        new_centroids = np.array([np.mean(cluster, axis=0) for cluster in clusters])
        
        # 檢查是否收斂(聚類中心是否不再變化)
        if np.all(centroids == new_centroids):
            break
        centroids = new_centroids
    
    return clusters, centroids
# 假設D是一個numpy陣列,其中包含n個樣本
# D = np.array([...])
# K = 目標聚類數量
# clusters, centroids = k_means(D, K)
在這個實現中,D是一個形狀為(n, m)的numpy陣列,其中n是樣本數量,m是每個樣本的特徵數量。K是目標聚類的數量。函數返回最終的聚類和聚類中心。
需要注意的是,K-means演算法對初始聚類中心的選擇非常敏感,可能會導致局部最優解。因此,在實踐中,可能需要多次運行演算法,或使用更高級的初始化方法,如K-means++。此外,K-means演算法假設聚類是球形的,並且所有的特徵維度都是同等重要的,這在某些情況下可能不是最佳的假設。