回顾:配送区域
本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 10 课,共 51 课。
挑战
简单还记得打开本章时看到的区域地图吗?现在画一张属于你的地图。某家面包店的货车要服务 150 个停靠点,而 stops.csv 中的东向距离以 km 为单位,北向距离以米为单位。
- 缩放两列数据。
- 对从 2 到 7 的每个 k,在缩放后的数据行上拟合 KMeans;输出它的惯性(保留 1 位小数)和轮廓系数(保留 3 位小数)。然后输出轮廓系数最高的 k。
- 用实际单位绘制该 k 对应的区域:每个区域的停靠点都要标出数量,例如
50 stops;在每个区域的均值处标出黑色星号,并添加图例。
另一个城市的结果:
k = 2: inertia 109.5, silhouette 0.535
k = 3: inertia 22.8, silhouette 0.737
k = 4: inertia 18.3, silhouette 0.597
k = 5: inertia 14.5, silhouette 0.443
k = 6: inertia 12.7, silhouette 0.368
k = 7: inertia 11.2, silhouette 0.364
Zones: 3以及它的地图:
然后 Coddy 会描述你的地图。
亲手试试
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
# 每个配送站点占一行:向东距离以 km 为单位,向北距离以米为单位(旧系统使用的单位)
stops = pd.read_csv("stops.csv")
X = stops[["east_km", "north_m"]]
fig, ax = plt.subplots()
ax.set_title("Delivery Zones")
ax.set_xlabel("East (km)")
ax.set_ylabel("North (m)")
# 在下方编写你的代码
无监督学习中的所有课
自己练习: Python 在线编译器