python k-means聚类算法 物流分配预测实战(超详细,附源码)

数据集和地图可以点赞关注收藏后评论区留下QQ邮箱或者私信博主要

聚类是一类机器学习基础算法的总称。

聚类的核心计算过程是将数据对象集合按相似程度划分成多个类,划分得到的每个类称为聚类的簇

聚类不等于分类,其主要区别在于聚类所面对的目标类别是未知的

k-means聚类也称为K均值聚类算法,是典型的聚类算法,对于给定的数据集和需要划分的类数K,算法根据距离函数进行迭代处理,动态 的把数据划分成K个簇,直到收敛为止,簇中心也称为聚类中心

先来个小例子

这个是通过聚类算法对鸢尾花数据集的预测结果

 代码如下

from sklearn.cluster import  KMeans
from sklearn import  datasets
import  numpy as np
iris=datasets.load_iris()
x=iris.data
y=iris.target
clf=KMeans(n_clusters=3)
model=clf.fit(x)
predicted=model.predict(x)
print("预测值",predicted)
print("真实值",y)
print()

 同样地k-means聚类算法广泛地应用于人群分类,图像分割,物种聚类等等问题中

下面以一个物流配送问题为例进行详细讲解

问题描述:双十一期间,物流公司要给某城市的50个客户配送货物,假设公司只有5辆货车,客户的地理坐标在txt文件中,如何配送效率最高

问题分析:使用k-means算法,将地址数据分为5类,由于每一类客户地址相近,可以分配给同一台货车

原地图如下

经过聚类分析后结果如下

 很明显根据客户的地址分为5个簇,每个簇由一台货车集中配送

源代码如下

#coding=utf-8
from numpy import *
from matplotlib import pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
def disteclud(veca,vecb):
    return sqrt(sum(power(veca-vecb,2)))
def initcenter(dataset,k):
    print('2.initalize cluster center')
    shape=dataset.shape
    n=shape[1]
    classcenter=array(zeros((k,n)))
    for j in range(n):
        firstk=dataset[:k,j]
        classcenter[:,j]=firstk
    return  classcenter
def mykmeans(dataset,k):
    m=len(dataset)
    clusterpoints=array(zeros((m,2)))
    classCenter=initcenter(dataset,k)
    clusterchanged=True
    print('3.recompute and reallocated')
    while clusterchanged:
        clusterchanged=False
        for i in range(m):
            mindist=inf
            minindex=-1
            for j in range(k):
                distji=disteclud(classCenter[j,:],dataset[i,:])
                if distji<mindist:
                    mindist=distji;minindex=j
            if clusterpoints[i,0]!=minindex:
                clusterchanged=True
            clusterpoints[i,:]=minindex,mindist**2
        for cent in range(k):
            ptsinclust=dataset[nonzero(clusterpoints[:,0]==cent)[0]]
            classCenter[cent,:]=mean(ptsinclust,axis=0)
    return classCenter,clusterpoints
def show(dataset,k,classCenter,clusterPoints):
    print('4.load the map')
    fig=plt.figure()
    rect=[0.1,0.1,1.0,1.0]
    axprops=dict(xticks=[],yticks=[])
    ax0=fig.add_axes(rect,label='ax1',frameon=False)
    imgp=plt.imread(r'C:\Users\Admin\Desktop\city.png')
    ax0.imshow(imgp)
    ax1=fig.add_axes(rect,label='ax1',frameon=False)
    print('5.show the clusters')
    numsamples=len(dataset)
    mark=['ok','^b','om','og','sc']
    for i in range(numsamples):
        markindex=int(clusterPoints[i,0])%k
        ax1.plot(dataset[i,0],dataset[i,1],mark[markindex])
    for i in range(k):
        markindex=int(clusterPoints[i,0])%k
        ax1.plot(classCenter[i,0],classCenter[i,1],'^r',markersize=12)
    plt.show()
print('1. load the dataset')
dataset=loadtxt(r'C:\Users\Admin\Desktop\testSet.txt')
k=5
classCenter,clssspoints=mykmeans(dataset,k)
show(dataset,k,classCenter,clssspoints)


数据集和地图可以点赞关注收藏后评论区留下QQ邮箱或者私信博主要

  • 76
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 70
    评论
DBSCAN (Density-Based Spatial Clustering of Applications with Noise) 是一种常用的航迹聚类算法,用于将轨迹数据分成不同的簇。它基于密度的概念,将具有足够高密度的点定义为核心点,并将与核心点相邻的点添加到同一个簇中。该算法还可以识别噪声点,即不属于任何簇的点。 DBSCAN算法的步骤如下: 1. 提取轨迹特征点:根据轨迹数据,使用一定的方法提取出轨迹的特征点,作为算法的输入。 2. 计算距离和密度:根据提取的特征点,计算每个点与其他点之间的距离,并确定每个点的密度。 3. 标记核心点:对于每个点,如果其邻域内的点数大于等于指定的阈值,则将其标记为核心点。 4. 扩展簇:从任意一个核心点开始,通过密度可达的方式将核心点的邻域内的点添加到同一个簇中。 5. 识别噪声点:将没有被分到任何簇中的点标记为噪声点。 DBSCAN算法在航迹聚类中的应用可以帮助识别出具有相似行为模式的轨迹,并将它们分组到不同的簇中。这对于分析航空、物流等领域的移动数据非常有用,可以帮助做出相应的决策和优化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [[转]出租车轨迹处理(一):预处理+DBSCAN聚类+gmplot可视化](https://blog.csdn.net/weixin_44026026/article/details/121054318)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Trajectory Clustering(DBSCAN算法进行轨迹聚类)](https://blog.csdn.net/Cogito_gum_ergo/article/details/106290188)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 70
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

showswoller

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值