- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 geopandas 数据框,其中包含多边形、region_id 和 center_point 纬度和经度(以弧度表示),如下所示:
然后我想根据每个区域的中心点对每个区域进行聚类,并执行以下操作:
#Set Up
kms_per_radian = 6371.0088
eps = 0.1/kms_per_radian
coords = blocks_meta.as_matrix(columns=['lat', 'lon'])
#Cluster
from sklearn.cluster import DBSCAN
db = DBSCAN(eps=epsilon, algorithm='ball_tree', metric='haversine', min_samples=1).fit(coords)
labels = db.labels_
clusters = pd.Series([coords[labels == n] for n in range(len(set(labels)))])
这会产生一个中心点簇数组,如下所示。
array([[ 0.0703843 , 0.170845 ],
[ 0.07037922, 0.17084981],
[ 0.07036705, 0.17085678],
[ 0.0703715 , 0.17083775]])
我正在努力弄清楚如何做是获取与每个集群关联的regions_ids以合并多边形以创建一个更大的区域,而无需循环遍历每个集群以及每个经纬度对并查询数据帧。
有没有办法传播 id 或查询每个集群的数据帧?
如有任何帮助,我们将不胜感激。
谢谢!
编辑
我想避免这样做:
clusters_of_regions = []
for cluster in clusters:
cluster_of_regions_ids = []
for entry in cluster:
print(cluster[0][0])
region_id = blocks_meta.loc[blocks_meta['lat'] == cluster[0][0]]['region_id'][1]
cluster_of_regions_ids.append(region_id)
clusters_of_regions.append(cluster_of_regions_ids)
两者都是为了避免嵌套的 for 循环 - 每当我尝试时,我都会不断收到关键错误:
有没有一种方法可以使用中心点作为属性来对区域本身进行聚类。
谢谢
最佳答案
查看 skleanr ( https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html ) 中的示例。我在这里修改了它以拥有一个数据框并类似于您的示例。
from sklearn.cluster import DBSCAN
import pandas as pd
import numpy as np
X = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]])
df = pd.DataFrame(X, index=list(range(len(X))), columns = ['col1', 'col2'])
clustering = DBSCAN(eps = 3, min_samples = 2).fit(df)
labels = clustering.labels_
df = df.merge(pd.Series(labels).to_frame().rename(columns={0:'clusters'}), left_index = True, right_index = True, how = 'outer')
df
给你:
col1 col2 clusters
0 1 2 0
1 2 2 0
2 2 3 0
3 8 7 1
4 8 8 1
5 25 80 -1
根据描述:
labels_ : array, shape = [n_samples] Cluster labels for each point in the dataset given to fit(). Noisy samples are given the label -1.
在该示例中,您将获得两个组(标签 0 和 1)。 -1 是一个“嘈杂”样本,这里的样本明显比其他样本大。
如果您执行类似的操作,您可以将您的regions_id和标签放在一起,并比较是否存在1:1关系。
关于python - 如何基于数组从 (geo)pandas 数据框中选择多行或传播聚类算法结果的元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53169521/
我是一名优秀的程序员,十分优秀!