快速答案
本答案頁包含 Python k-means 聚類:從距離到收斂 的 4 道選擇題、4 道填空題和 4 道輸出預測題,每題都給出準確答案和簡短解釋。
答案已完整展示,建議先嘗試作答,再用本頁核對。第一次練習最好從互動練習頁開始。
在 k-means 中,k 表示什麼?
答案: 簇的數量
為什麼: k 在迴圈前確定,決定維護多少個質心。
所有點都分配給質心之後會發生什麼?
答案: 每個質心移動到已分配點的平均值
為什麼: 更新步驟會計算每個簇在各坐標上的平均值。
為什麼在 k-means 前要縮放特徵?
答案: 量綱大的特徵會主導距離
為什麼: 以千為單位的特徵會壓過零到一之間的特徵。
執行結果是什麼?
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
為什麼: 這個點距離第二個質心 (5, 5) 更近。
補全歐氏距離的指數。
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 次方。
補全最近質心的鍵函式。
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
為什麼: 鍵函式用距離函式比較目前點與每個質心。
補全質心平均值的分母。
points = [(0, 0), (0, 1)]
members = points
x_mean = sum(x for x, _ in members) / ____
print(x_mean)答案: len(members)
為什麼: 平均值用坐標和除以簇內成員數量。
補全收斂判斷。
points = [(0, 0), (5, 5)]
labels = [0, 0]
new_labels = [0, 0]
if new_labels == ____:
print("stable")答案: labels
為什麼: 當新標籤與上一輪標籤相同時,迴圈停止。
這段程式列印出什麼?
import math
print(math.dist((0, 0), (3, 4)))答案: 5.0
為什麼: 兩點之間的歐氏距離是 5.0。
程式碼的輸出結果是什麼?
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。
螢幕上會顯示什麼?
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)。
這段程式碼會輸出什麼?
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 道題。