DBSCAN
利用 DBSCAN 聚类算法,对经纬度进行聚类
代码如下:
import pandas as pd
import numpy as np
from sklearn.cluster import DBSCAN
from sklearn import metrics
import os
def dbscan(input_file):
columns=['lon','lat']
in_df = pd.read_csv(input_file, sep=',', header=1, names=columns)
print(in_df)
coords = in_df.values
kms_per_radian = 6371.0086
epsilon = 0.4 / kms_per_radian
db = DBSCAN(eps=epsilon, min_samples=10, algorithm='ball_tree', metric='haversine').fit(np.radians(coords))
cluster_labels = db.labels_
num_clusters = len(set(cluster_labels) - set([-1]))
print( 'Clustered ' + str(len(in_df)) + ' points to ' + str(num_clusters) + ' clusters')
for n in range(num_clusters):
#print('Cluster ', n, ' all samples:')
one_cluster = coords[cluster_labels == n]
print(len(one_cluster))
#clist = one_cluster.tolist()
#print(clist[0])
def main():
path = './data'
f = 'placell.csv'
datafile = os.path.join(path,f)
print(datafile)
dbscan(datafile)
if __name__ == '__main__':
main()
利用此算法,将 12094 家店铺聚类为 163 类,每一类至少有 10 家店铺。
并存储。
重新做数据,将聚类标签添加至数据集中。
创建 dqn_coords,训练不同地理位置所适应的店铺。
将其作为参数引入 YELP 的推荐中。
获得新的推荐结果。
数据模拟
对用户的 70W+ 记录进行完全随机模拟生成用户所在地理位置,或许,模拟出的位置分类与其真实所到的位置相距很远,
但是在后期推荐的时候,由于推荐结果的某些特性,在一定程度上来说,提高了对于分类的准确性,综合结果有待评价。
若利用聚类的结果,对用户的 70W+ 记录进行随机模拟生成用户所在地理位置,其模拟出的位置与实际位置相距很近,
但在后期推荐的时候,对于根据地理位置进行推荐的准确率有所偏低,综合结果有待评价。