kmeans —— since 1957:
两个变量:多大的半径(eps) 区域中至少包含多少个点(minPts) 可被视为『密集』
几个概念:核心对象、直接密度可达、密度可达、密度相连
过程
算法可从任意点出发,它在出发点的距离 eps 之内发现所有附近点
如果附近点的数量 >= minPts,群被形成。 出发点和它的邻居增加到这群,并且出发点被标记为visited。 然后递归评估所有未被标记为visited的该群成员,从而对群进行扩展。
如果邻居的数量比minPts少,则该点暂时被标记作为噪声。
如果群充分地被扩展(群内的所有点被标记为visited),然后重复地去处理unvisited点
def cluster(points, eps=EPS, min_samples=MIN_SAMPLES):
X = np.array(points)
#X = StandardScaler().fit_transform(X)
db = DBSCAN(eps=eps, min_samples=min_samples).fit(X)
labels = db.labels_
core_mask = np.zeros_like(labels, dtype=bool)
core_mask[db.core_sample_indices_] = True
return labels, core_mask
def get_params(delta_lat, delta_lng, count, n=400, k=1.5):
area = delta_lat * delta_lng
if count < n:
n = count + 1 # 防止 count 为 0 出错
eps = max(math.sqrt((area / n) / math.pi), 0.0015)
min_samples = max(math.ceil(k * count / n), 4)
return eps, min_samples