答案頁 · 12 道題

Python k-means 聚類:從距離到收斂練習答案

本頁彙整 Python k-means 聚類:從距離到收斂 的 12 道練習。先做練習頁,再回到這裡核對準確答案和原因。

快速答案

本答案頁包含 Python k-means 聚類:從距離到收斂 的 4 道選擇題、4 道填空題和 4 道輸出預測題,每題都給出準確答案和簡短解釋。

答案已完整展示,建議先嘗試作答,再用本頁核對。第一次練習最好從互動練習頁開始。

01 · 選擇題

在 k-means 中,k 表示什麼?

  1. 特徵數量
  2. 簇的數量正確答案
  3. 訓練標籤數量
  4. 學習率

答案: 簇的數量

為什麼: k 在迴圈前確定,決定維護多少個質心。

02 · 選擇題

所有點都分配給質心之後會發生什麼?

  1. 簇數量翻倍
  2. 樣本會被打亂
  3. 距離函式會被刪除
  4. 每個質心移動到已分配點的平均值正確答案

答案: 每個質心移動到已分配點的平均值

為什麼: 更新步驟會計算每個簇在各坐標上的平均值。

03 · 選擇題

為什麼在 k-means 前要縮放特徵?

  1. 它能保證全局最優
  2. 這樣就不需要質心了
  3. 量綱大的特徵會主導距離正確答案
  4. 縮放會增加簇數量

答案: 量綱大的特徵會主導距離

為什麼: 以千為單位的特徵會壓過零到一之間的特徵。

04 · 選擇題

執行結果是什麼?

def distance(a, b):
    return sum((x - y) ** 2 for x, y in zip(a, b)) ** 0.5

centroids = [(0, 0), (5, 5)]
point = (4, 4)
print(min(range(len(centroids)), key=lambda i: distance(point, centroids[i])))
  1. 0
  2. 1正確答案
  3. 0.5
  4. 2

答案: 1

為什麼: 這個點距離第二個質心 (5, 5) 更近。

05 · 填空題

補全歐氏距離的指數。

def distance(a, b):
    return sum((x - y) ** 2 for x, y in zip(a, b)) ** ____

print(round(distance((0, 0), (3, 4)), 1))

答案: 0.5

為什麼: 開平方等價於把和提升到 0.5 次方。

06 · 填空題

補全最近質心的鍵函式。

def distance(a, b):
    return sum((x - y) ** 2 for x, y in zip(a, b)) ** 0.5

centroids = [(0, 0), (5, 5)]
point = (1, 1)
print(min(range(len(centroids)), key=lambda i: ____(point, centroids[i])))

答案: distance

為什麼: 鍵函式用距離函式比較目前點與每個質心。

07 · 填空題

補全質心平均值的分母。

points = [(0, 0), (0, 1)]
members = points
x_mean = sum(x for x, _ in members) / ____
print(x_mean)

答案: len(members)

為什麼: 平均值用坐標和除以簇內成員數量。

08 · 填空題

補全收斂判斷。

points = [(0, 0), (5, 5)]
labels = [0, 0]
new_labels = [0, 0]
if new_labels == ____:
    print("stable")

答案: labels

為什麼: 當新標籤與上一輪標籤相同時,迴圈停止。

09 · 輸出預測

這段程式列印出什麼?

import math
print(math.dist((0, 0), (3, 4)))

答案: 5.0

為什麼: 兩點之間的歐氏距離是 5.0。

10 · 輸出預測

程式碼的輸出結果是什麼?

def distance(a, b):
    return sum((x - y) ** 2 for x, y in zip(a, b)) ** 0.5

centroids = [(0, 0), (5, 5)]
point = (1, 1)
print(min(range(len(centroids)), key=lambda i: distance(point, centroids[i])))

答案: 0

為什麼: 這個點離第一個質心最近,所以索引是 0。

11 · 輸出預測

螢幕上會顯示什麼?

points = [(0, 0), (0, 1)]
members = points
centroid = (
    sum(x for x, _ in members) / len(members),
    sum(y for _, y in members) / len(members),
)
print(tuple(round(value, 1) for value in centroid))

答案: (0.0, 0.5)

為什麼: (0, 0) 與 (0, 1) 的平均值是 (0.0, 0.5)。

12 · 輸出預測

這段程式碼會輸出什麼?

def distance(a, b):
    return sum((x - y) ** 2 for x, y in zip(a, b)) ** 0.5

points = [(0, 0), (0, 1), (5, 5), (5, 6)]
centroids = [(0, 0), (5, 5)]
labels = None
for _ in range(10):
    new_labels = [min(range(len(centroids)), key=lambda i: (distance(point, centroids[i]), i)) for point in points]
    new_centroids = []
    for index in range(len(centroids)):
        members = [point for point, label in zip(points, new_labels) if label == index]
        new_centroids.append((sum(x for x, _ in members) / len(members), sum(y for _, y in members) / len(members)))
    if new_labels == labels:
        break
    labels = new_labels
    centroids = new_centroids
print(labels)

答案: [0, 0, 1, 1]

為什麼: 前兩個點屬於質心 0,後兩個點屬於質心 1。

先試一遍題目

打開 Python k-means 聚類:從距離到收斂 練習頁,用即時回饋回答同樣的 12 道題。

練習本課