从零开始搭建django前后端分离项目 系列六(实战之聚类分析)

项目需求

本项目从impala获取到的数据为用户地理位置数据,每小时的数据量大概在8000万条,数据格式如下:

公司要求对这些用户按照聚集程度进行划分,将300米范围内用户数大于200的用户划分为一个簇,并计算这个簇的中心点和簇的边界点。

附模拟的数据:https://files.cnblogs.com/files/dotafeiying/test.zip

 

实现原理

下面我们来一步一步实现上述需求:

1、将用户按照聚集程度进行划分

我们可以选择基于密度的聚类算法DBscan算法,DBSCAN算法的重点是选取的聚合半径参数eps和聚合所需指定的数目min_samples,正好对应这里的300米和200个用户。但是需要注意的是,dbscan算法的默认距离度量为欧几里得距离,而我们需要的是球面距离,所以需要定制我们自己的距离算法运用到dbscan算法中。解决方法是:将dbscan设置为 metric='precomputed' ,这时fit传入的X参数必须为相似度矩阵,然后fit函数会直接用你这个矩阵来进行计算。这意味着我们可以用我们自定义的距离事先计算好各个向量的相似度,然后调用这个函数来获得结果。

2、识别簇的边界点

这里我使用凸包算法来计算簇的边界点,那么问题就变成:如何求一个平面内所有点的最小凸边形。在scipy.spatial 和opencv 分别有计算凸包的函数,不清楚的可以自行百度。

3、计算簇的中心点

由于dbscan算法中并没有提到获取簇中心点的方法,那么我们就需要自己设计来计算簇的中心点。现在簇的所有点已知,我们可以利用k-means算法来计算簇的中心点,只需要设置K=1(即质心为1)。

 

实现代码

# -*- coding:utf-8 -*-
from math import radians, cos, sin, asin, sqrt,degrees
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN, KMeans
from scipy.spatial import ConvexHull
from sklearn.cluster import MeanShift, estimate_bandwidth
from scipy.spatial.distance import pdist, squareform
from sklearn import metrics

pd.set_option('display.width', 400)
pd.set_option('display.expand_frame_repr', False)
pd.set_option('display.max_columns', 70)

def haversine(lonlat1, lonlat2):
    lat1, lon1 = lonlat1
    lat2, lon2 = lonlat2
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
    c = 2 * asin(sqrt(a))
    r = 6371  # Radius of earth in kilometers. Use 3956 for miles
    return c * r

if __name__=='__main__':
    df=pd.read_csv('test.csv')
    print(df.head())
    X=df[['mr_longitude','mr_latitude']].values

    radius = 200
    epsilon = radius / 100000
    min_samples = 40

    # model = DBSCAN(eps=epsilon, min_samples=min_samples)
    # y_pred = model.fit_predict(X)

    # # 自定义度量距离
    distance_matrix = squareform(pdist(X, (lambda u, v: haversine(u, v))))
    db = DBSCAN(eps=300, min_samples=200, metric='precomputed')
    y_pred = db.fit_predict(distance_matrix)
    print(y_pred.tolist())

    n_clusters_ = len(set(y_pred)) - (1 if -1 in y_pred else 0)  # 获取分簇的数目
    print('分簇的数目:',n_clusters_)
    df['label'] = y_pred

    df_group = df[df['label'] != -1][['mr_longitude', 'mr_latitude', 'label']].groupby(['label'])
    plt.figure(facecolor='w')
    for label, group in df_group:
        points = group[['mr_longitude', 'mr_latitude']].values
        # 得到凸轮廓坐标的索引值,逆时针画
        hull = ConvexHull(points).vertices.tolist()
        hull.append(hull[0])
        plt.plot(points[hull, 0], points[hull, 1], 'r--^', lw=2)
        for i in range(len(hull) - 1):
            plt.text(points[hull[i], 0], points[hull[i], 1], str(i), fontsize=10)
    plt.scatter(X[:, 0], X[:, 1], c=y_pred,s=4)
    plt.grid(True)
    plt.show()

 

可视化

 

实际项目中的效果图

 

转载于:https://www.cnblogs.com/dotafeiying/p/9669898.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python+Vue+Django前后端分离项目实战,涉及到使用Python语言编写后端服务,使用Vue框架构建前端界面,并通过Django框架作为API接口实现前后端数据交互的方式。在实战项目中也会涉及到数据库设计和调用、权限控制、文件上传等问题的解决。 ### 回答2: Python、Vue和Django是现在非常流行的前后端开发技术。如果你想学习这些技术,那么前后端分离是一个很好的选择。在这个项目中使用Python作为后端编程语言,Django作为Web框架,Vue作为前端框架。我们可以在这个项目中学习到很多关于前后端分离的经验。 首先,前后端分离可以让我们更好地组织我们的代码。在一个分离的项目中,我们可以通过明确的接口来分离前端和后端。这样一来,我们可以专注于开发代码,而不必担心前后端之间的交互问题。 其次,前后端分离可以使我们更好地实现可重用性。在这个项目中,我们可以编写可重用的Vue组件,并在不同的前端页面中使用它们。同样地,我们也可以编写可重用的Django应用程序,并在不同的后端端中使用它们。这会使我们的代码更加清晰简洁,也可以提高我们的开发效率。 最后,前后端分离可以让我们更好地实现可维护性。在一个分离的项目中,我们可以更轻松地进行单元测试和端到端测试。这可以帮助我们保持代码的质量,并尽早发现和解决潜在的问题。 总之,Python、Vue和Django前后端分离项目是一个非常好的学习项目。通过这个项目,我们可以从实践中学习如何使用这些技术,并在以后的项目中更好地应用它们。 ### 回答3: Python、Vue和Django是目前非常流行的技术栈之一,其中PythonDjango主要用于后端开发,Vue则是一款流行的前端框架。PythonDjango的优在于它们易于学习、可扩展性强、社区活跃,并且可以用于构建各种类型的Web应用程序。而Vue的优在于它简洁、高效、组件化,并且可以很好地配合其他框架和库使用。 前后端分离是一种可以将前端和后端分别开发的方法,这种方法具有很多优。首先,可以使开发人员更加专注于各自的领域,减少互相干扰和影响。其次,这种方法可以提高应用程序的可维护性和可扩展性。最后,这种方法还可以提高开发效率,使开发人员能够更加高效地开发应用程序。 在前后端分离项目实战中,需要注意以下几。首先,需要确定应用程序的需求,确定前端和后端的接口规范。其次,需要使用合适的工具和框架来完成前后端的开发任务。对于后端开发,可以使用Django的REST框架,这个框架可以很快地构建RESTful API,并且配合数据库使用。而对于前端开发,则可以使用Vue框架来开发,Vue可以很好地处理数据和UI逻辑。最后,需要着重测试和调试应用程序,确保应用程序的正确性和可用性。 总的来说,Python、Vue和Django是一组非常流行的技术栈,非常适合用于前后端分离项目的开发。在开发前需要确定好需求,选择好工具和框架,开发期间需要注重测试和调试,这样才能开发出高质量的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值