按距离和约束来聚类地理列表

问题描述 投票:0回答:2

我有一个送货应用程序,我想通过位置接近度(线性距离)和约束(例如最大订单和最大总产品(每个订单有一定数量的产品))对订单(每个订单具有纬度和经度坐标)进行分组一组。

对于邻近度分组,我使用了DBSCAN

coordinates = [[lat,lng],[lat,lng]],[lat,lng]],[lat,lng]],[lat,lng]]]
distance_matrix = squareform(pdist(coordinates, (lambda u,v: haversine(u,v))))

#eps=0.1 => 100m radius, 50m linear
db = DBSCAN(eps=0.1, min_samples=2, metric='precomputed')
results = db.fit(distance_matrix)

如何在此功能中添加约束?

仍然可以通过使用DBSCAN或HDBSCAN以外的方式来做到这一点吗?

python cluster-analysis latitude-longitude hdbscan
2个回答
0
投票

不幸的是,我认为您想要的模型应该从头开始开发。

您的问题可以建模为以下优化模型。


0
投票

这是一个有趣的问题。我想可以用许多不同的方法来完成。这是您考虑的一种解决方案。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
import seaborn as sns; sns.set()
import csv


df = pd.read_csv('C:\\your_path\\properties_2017.csv')
# df.head(10)
df = df.head(10000)

df.shape


df.dropna(axis=0,how='any',subset=['latitude','longitude'],inplace=True)

# Variable with the Longitude and Latitude
X=df.loc[:,['parcelid','latitude','longitude']]
X.head(10)

K_clusters = range(1,10)
kmeans = [KMeans(n_clusters=i) 

for i in K_clusters]
Y_axis = df[['latitude']]
X_axis = df[['longitude']]
score = [kmeans[i].fit(Y_axis).score(Y_axis)

for i in range(len(kmeans))] # Visualize
plt.plot(K_clusters, score)
plt.xlabel('Number of Clusters')
plt.ylabel('Score')
plt.title('Elbow Curve')
plt.show()
© www.soinside.com 2019 - 2024. All rights reserved.