Menu
CoddyTech

选择 eps

本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 22 课,共 51 课。

eps 只是一个猜测,观察数据后才能确定。对于“噪声点”中的公园,测量每个点到第 4 个最近邻的距离,并把该点自身也计入,就像 min_samples=4。将距离排序并绘图:

71 个已排序距离形成的上升曲线:野餐点附近的距离较低且平缓,约为 1 m;随后在约 3 m 处急剧转折,虚线标出 eps,独自一人的点对应的距离则陡然上升

密集的点位置低且平缓,孤立的点则会陡然上升。曲线开始向上弯折的“拐点”是选择 eps 的好位置:

from sklearn.neighbors import NearestNeighbors
nn = NearestNeighbors(n_neighbors=4).fit(X)
distances, rows = nn.kneighbors(X)
ax.plot(np.sort(distances[:, -1]))

kneighbors 会给出每个点到最近的 4 个邻居的距离,并按距离从近到远排列,因此列 -1 是第 4 个。np.sort 会对它们排序。

challenge icon

挑战

中等

地震学家希望 DBSCAN 能根据一年的地震数据找出断层线,并将 min_samples=5。选择它的 eps。

  1. 在 X 上拟合 NearestNeighbors(n_neighbors=5),并获取每次地震的距离。
  2. 绘制第 5 近邻距离,并按顺序排序。
  3. 运行代码并找出拐点。将该值保存在 eps 中,使用 ax.axhline 绘制灰色虚线,然后显示图表。

对于另一个地区,拐点大约在 4 km 处:

一张标题为“到第 5 近邻地震的距离”的图表:曲线在约 145 次地震中保持平缓,接近 2 km,随后急剧上升,超过 50 km;拐点处有一条位于 4 km 的灰色虚线

Coddy 会描述你的图表,然后使用你的 eps 运行 DBSCAN。

亲手试试

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.neighbors import NearestNeighbors

# 某地区一年内的地震:每个震中的位置以 km 为单位
quakes = pd.read_csv("quakes.csv")
X = np.column_stack([quakes["east_km"], quakes["north_km"]])

fig, ax = plt.subplots()
ax.set_title("Distance to the 5th Nearest Quake")
ax.set_xlabel("Quakes, sorted")
ax.set_ylabel("Distance (km)")

# 在下方编写你的代码
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

无监督学习中的所有课

自己练习: Python 在线编译器