婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > python 基于空間相似度的K-means軌跡聚類的實(shí)現(xiàn)

python 基于空間相似度的K-means軌跡聚類的實(shí)現(xiàn)

熱門標(biāo)簽:400電話申請(qǐng)服務(wù)商選什么 在哪里辦理400電話號(hào)碼 清遠(yuǎn)360地圖標(biāo)注方法 千陽(yáng)自動(dòng)外呼系統(tǒng) 工廠智能電話機(jī)器人 平頂山外呼系統(tǒng)免費(fèi) 江蘇客服外呼系統(tǒng)廠家 西藏智能外呼系統(tǒng)五星服務(wù) 原裝電話機(jī)器人

這里分享一些軌跡聚類的基本方法,涉及軌跡距離的定義、kmeans聚類應(yīng)用。
需要使用的python庫(kù)如下

import pandas as pd
import numpy as np
import random
import os
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.spatial.distance import cdist
from itertools import combinations
from joblib import Parallel, delayed
from tqdm import tqdm

數(shù)據(jù)讀取

假設(shè)數(shù)據(jù)是每一條軌跡一個(gè)excel文件,包括經(jīng)緯度、速度、方向的航班數(shù)據(jù)。我們從文件中讀取該數(shù)據(jù),保存在字典中。
獲取數(shù)據(jù)的地址,假設(shè)在多個(gè)文件中

def get_alldata_path(path):
  all_path = pd.DataFrame(columns=['path_root','path0','path1','path2','path','datalist'])
  path0 = os.listdir(path)
  for path_temp0 in path0:
    path1 = os.listdir(path+path_temp0)
    for path_temp1 in path1:
      path2 = os.listdir(path+path_temp0+'\\'+path_temp1)
      for path_temp2 in path2:
        path3 = os.listdir(path+path_temp0+'\\'+path_temp1+'\\'+path_temp2)
        all_path.loc[all_path.shape[0]] = [path,path_temp0,path_temp1,path_temp2,
                            path+path_temp0+'\\'+path_temp1+'\\'+path_temp2+'\\',
                            path3]
  return all_path

這樣你就可以得到你的數(shù)據(jù)的地址,方便后面讀取需要的數(shù)據(jù)

#設(shè)置數(shù)據(jù)根目錄
path = 'yourpath'
#獲取所有數(shù)據(jù)地址
data_path = get_alldata_path(path)

讀取數(shù)據(jù),保存成字典格式,字典的key是這條軌跡的名稱,value值是一個(gè)DataFrame,需要包含經(jīng)緯度信息。

def read_data(data_path,idxs):
   '''
   功能:讀取數(shù)據(jù)
   '''
   data = {}
   for idx in idxs:
     path_idx = data_path['path'][idx]
     for dataname in data_path['datalist'][idx]:
       temp = pd.read_excel(path_idx+dataname,header=None)
       temp = temp.loc[:,[4,5,6,8]]
       temp.replace('none',np.nan,inplace=True)
       temp.replace('Trak',np.nan,inplace=True)
       temp = temp.dropna().astype(float)
       temp.columns = ['GPSLongitude','GPSLatitude','direction','speed']
       data[str(idx)+'_'+dataname] = temp
   return data

讀取你想要的數(shù)據(jù),前面讀取到的地址也是一個(gè)DataFrame,選擇你想要進(jìn)行聚類的數(shù)據(jù)讀取進(jìn)來(lái)。

#讀取你想要的數(shù)據(jù)
idxs = [0,1,2]
data = read_data(data_path,idxs)

定義不同軌跡間的距離

這里使用了雙向的Hausdorff距離(雙向豪斯多夫距離)
給定兩條軌跡A和B,其中軌跡A上有n個(gè)點(diǎn),軌跡B上有m個(gè)點(diǎn)。它們之間的空間相似距離d定義為:


其中,di ,j 是一條軌跡上的第 i個(gè)點(diǎn)到另一條軌跡上的 第 j 個(gè) 點(diǎn)之間的多因素歐氏距離。可見, 如果軌跡 A 和 B 越相似, 它們之間的距離就越小, 反之則越大。

def OneWayHausdorffDistance(ptSetA, ptSetB):
  # 計(jì)算任意向量之間的距離,假設(shè)ptSetA有n個(gè)向量,ptSetB有m個(gè)向量
  # 得到矩陣C(n行m列)Cij代表A中都第i個(gè)向量到B中第j向量都距離
  dist = cdist(ptSetA, ptSetB, metric='euclidean')
  # np.min(dist,axis=1):計(jì)算每一行的的最小值
  # 即:固定點(diǎn)集A的值,求點(diǎn)集A中到集合B的最小值
  return np.max(np.min(dist, axis=1))
	# 計(jì)算雙向的Hausdorff距離=====>H(ptSetA,ptSetB)=max(h(ptSetA,ptSetB),h(ptSetB,ptSetA))
	# ptSetA:輸入的第一個(gè)點(diǎn)集
	# ptSetB:輸入的第二個(gè)點(diǎn)集
	# Hausdorff距離度量了兩個(gè)點(diǎn)集間的最大不匹配程度
def HausdorffDistance(ptSetA, ptSetB):
  # 計(jì)算雙向的Hausdorff距離距離
  
  res = np.array([
    OneWayHausdorffDistance(ptSetA, ptSetB),
    OneWayHausdorffDistance(ptSetB, ptSetA)
  ])
  return np.max(res) 

計(jì)算距離矩陣

每個(gè)軌跡數(shù)據(jù)都包含經(jīng)緯度、速度、方向,分別計(jì)算距離,然后根據(jù)一定的比例相加,活動(dòng)最終的距離。

def DistanceMat(data,w=[0.7,0.2,0.1]):
   '''
   功能:計(jì)算軌跡段的距離矩陣
   輸出:距離矩陣
   '''
   #要計(jì)算的組合
   ptCom = list(combinations(list(data.keys()),2))
   #基于軌跡的距離
   distance_tra = Parallel(n_jobs=8,verbose=False)(delayed(HausdorffDistance)(
          data[ptSet1][['GPSLongitude','GPSLatitude']],data[ptSet2][['GPSLongitude','GPSLatitude']]
          ) for ptSet1,ptSet2 in ptCom)
   distancemat_tra = pd.DataFrame(ptCom)
   distancemat_tra['distance'] = distance_tra 
   distancemat_tra = distancemat_tra.pivot(index=0,columns=1,values='distance')
   for pt1 in data.keys():
     distancemat_tra.loc[str(pt1),str(pt1)] = 0
   distancemat_tra = distancemat_tra.fillna(0)
   distancemat_tra = distancemat_tra.loc[list(data.keys()),list(data.keys())]
   distancemat_tra = distancemat_tra+distancemat_tra.T
   
   #基于方向的距離
   distance_speed = Parallel(n_jobs=8,verbose=False)(delayed(HausdorffDistance)(
          data[ptSet1][['speed']],data[ptSet2][['speed']]
          ) for ptSet1,ptSet2 in ptCom)
   distancemat_speed = pd.DataFrame(ptCom)
   distancemat_speed['distance'] = distance_speed 
   distancemat_speed = distancemat_speed.pivot(index=0,columns=1,values='distance')
   for pt1 in data.keys():
     distancemat_speed.loc[str(pt1),str(pt1)] = 0
   distancemat_speed = distancemat_speed.fillna(0)
   distancemat_speed = distancemat_speed.loc[list(data.keys()),list(data.keys())]
   distancemat_speed = distancemat_speed+distancemat_speed.T
   #基于方向的距離
   distance_direction = Parallel(n_jobs=8,verbose=False)(delayed(HausdorffDistance)(
          data[ptSet1][['direction']],data[ptSet2][['direction']]
          ) for ptSet1,ptSet2 in ptCom)
   distancemat_direction = pd.DataFrame(ptCom)
   distancemat_direction['distance'] = distance_direction 
   distancemat_direction = distancemat_direction.pivot(index=0,columns=1,values='distance')
   for pt1 in data.keys():
     distancemat_direction.loc[str(pt1),str(pt1)] = 0
   distancemat_direction = distancemat_direction.fillna(0)
   distancemat_direction = distancemat_direction.loc[list(data.keys()),list(data.keys())]
   distancemat_direction = distancemat_direction+distancemat_direction.T
   distancemat_tra = (distancemat_tra-distancemat_tra.min().min())/(distancemat_tra.max().max()-distancemat_tra.min().min())
   distancemat_speed = (distancemat_speed-distancemat_speed.min().min())/(distancemat_speed.max().max()-distancemat_speed.min().min())
   distancemat_direction = (distancemat_direction-distancemat_direction.min().min())/(distancemat_direction.max().max()-distancemat_direction.min().min())
   distancemat = w[0]*distancemat_tra+w[1]*distancemat_speed+w[2]*distancemat_direction 
   return distancemat

使用前面讀取的數(shù)據(jù),計(jì)算不同軌跡間的距離矩陣,缺點(diǎn)在于計(jì)算時(shí)間會(huì)隨著軌跡數(shù)的增大而指數(shù)增長(zhǎng)。

distancemat = DistanceMat(data,w=[0.7,0.2,0.1])

k-means聚類

獲得了不同軌跡間的距離矩陣后,就可以進(jìn)行聚類了。這里選擇k-means,為了得到更好的結(jié)果,聚類前的聚類中心選取也經(jīng)過(guò)了一些設(shè)計(jì),排除了隨機(jī)選擇,而是選擇盡可能遠(yuǎn)的軌跡點(diǎn)作為 初始中心。
初始化聚類“中心”。隨機(jī)選取一條軌跡作為第一類的中心, 即選取一個(gè)軌跡序列作為聚類的初始“中心。然后在剩下的 L - 1 個(gè)序列中選取一個(gè)序列 X 2 作為第二類的中心 C 2 , 設(shè)定一個(gè)閾值 q, 使其到第一類的中心 C 1 的距離大于q。

class KMeans:
  def __init__(self,n_clusters=5,Q=74018,max_iter=150):
     self.n_clusters = n_clusters #聚類數(shù)
     self.Q = Q
     self.max_iter = max_iter  # 最大迭代數(shù)
     
  def fit(self,distancemat):
     #選擇初始中心
     best_c = random.sample(distancemat.columns.tolist(),1)  
     for i in range(self.n_clusters-1):
       best_c += random.sample(distancemat.loc[(distancemat[best_c[-1]]>self.Q)(~distancemat.index.isin(best_c))].index.tolist(),1) 
     center_init = distancemat[best_c] #選擇最小的樣本組合為初始質(zhì)心
     self._init_center = center_init
     #迭代停止條件
     iter_ = 0
     run = True
     #開始迭代
     while (iter_self.max_iter)(run==True):
       #聚類聚類標(biāo)簽更新
       labels_ = np.argmin(center_init.values,axis=1)
       #聚類中心更新
       best_c_ = [distancemat.iloc[labels_== i,labels_==i].sum().idxmin() for i in range(self.n_clusters)]
       center_init_ = distancemat[best_c_]
       #停止條件
       iter_ += 1
       if best_c_ == best_c:
          run = False
       center_init = center_init_.copy()
       best_c = best_c_.copy()
     #記錄數(shù)據(jù)
     self.labels_ = np.argmin(center_init.values,axis=1)
     self.center_tra = center_init.columns.values
     self.num_iter = iter_
     self.sse = sum([sum(center_init.iloc[self.labels_==i,i]) for i in range(self.n_clusters)])

應(yīng)用聚類,根據(jù)平方誤差和SSE結(jié)合手肘法確定最佳的聚類數(shù),使用最佳的聚類數(shù)獲得最后聚類模型。

 #聚類,保存不同的sse
SSE = []
for i in range(2,30):
 kmeans = KMeans(n_clusters=i,Q=0.01,max_iter=150)
 kmeans.fit(distancemat)
 SSE.append(kmeans.sse)
#畫圖
plt.figure(0)
plt.plot(SSE)
plt.show()

#使用最好的結(jié)果進(jìn)行聚類
n_clusters=12
kmeans = KMeans(n_clusters=n_clusters,Q=0.01,max_iter=150)
kmeans.fit(distancemat)
kmeans.sse #輸出sse
kmeans.labels_ #輸出標(biāo)簽
kmeans.center_tra #輸出聚類中心

#畫圖,不同類的軌跡使用不同的顏色
plt.figure(1)
for i in range(n_clusters):
  for name in distancemat.columns[kmeans.labels_==i]:
    plt.plot(data[name].loc[:,'GPSLongitude'],data[name].loc[:,'GPSLatitude'],c=sns.xkcd_rgb[list(sns.xkcd_rgb.keys())[i]])
plt.show()

#保存每一個(gè)軌跡屬于哪一類
kmeans_result = pd.DataFrame(columns=['label','id'])
for i in range(n_clusters):
  kmeans_result.loc[i] = [i,distancemat.columns[kmeans.labels_==i].tolist()]

到此這篇關(guān)于python 基于空間相似度的K-means軌跡聚類的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python K-means軌跡聚類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python中的單繼承與多繼承實(shí)例分析
  • 詳細(xì)總結(jié)Python類的多繼承知識(shí)
  • Python進(jìn)階學(xué)習(xí)之帶你探尋Python類的鼻祖-元類
  • python利用K-Means算法實(shí)現(xiàn)對(duì)數(shù)據(jù)的聚類案例詳解
  • python類的繼承鏈實(shí)例分析
  • python-pandas創(chuàng)建Series數(shù)據(jù)類型的操作
  • python調(diào)用stitcher類自動(dòng)實(shí)現(xiàn)多個(gè)圖像拼接融合功能
  • Python繪制分類圖的方法
  • python實(shí)現(xiàn)批量提取指定文件夾下同類型文件
  • 詳解python函數(shù)傳參傳遞dict/list/set等類型的問(wèn)題
  • Python中的類對(duì)象示例詳解
  • 淺談Python類的單繼承相關(guān)知識(shí)

標(biāo)簽:隨州 西安 日照 安慶 錦州 天水 白城 股票

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python 基于空間相似度的K-means軌跡聚類的實(shí)現(xiàn)》,本文關(guān)鍵詞  python,基于,空間,相似,度,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《python 基于空間相似度的K-means軌跡聚類的實(shí)現(xiàn)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于python 基于空間相似度的K-means軌跡聚類的實(shí)現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国内久久精品视频| 亚洲一级在线观看| 中文字幕一区二区三区色视频 | 久久久午夜精品理论片中文字幕| 亚洲国产精品久久不卡毛片| 国产精品欧美一级免费| 国产成人午夜99999| 日韩三级视频中文字幕| 欧美精品一区二区久久婷婷| 免播放器亚洲一区| 日韩午夜在线影院| 国产精品一区二区三区99| 极品少妇一区二区三区精品视频| 亚洲国产成人午夜在线一区| 91亚洲永久精品| 亚洲精品视频一区二区| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 欧美日韩在线播放三区四区| 亚洲尤物在线视频观看| 555www色欧美视频| 狠狠v欧美v日韩v亚洲ⅴ| 精品电影一区二区| 精品噜噜噜噜久久久久久久久试看 | 精品制服美女丁香| 欧美不卡在线视频| 成人激情午夜影院| 精品国产区一区| 日韩欧美久久一区| 日韩免费电影一区| 久久久综合九色合综国产精品| 精品久久久久久久久久久久久久久久久| 欧美亚洲动漫精品| 欧美日韩黄色影视| 欧美电影免费提供在线观看| 精品久久久久久久久久久院品网| 国产99一区视频免费| 男女男精品网站| 欧美影视一区在线| 国产一区二区在线看| 亚洲大尺度视频在线观看| 国产欧美日产一区| 91精品办公室少妇高潮对白| 国产美女一区二区| 日本欧美一区二区三区乱码| 亚洲欧美日韩国产综合| 亚洲精品一区二区三区影院| 大尺度一区二区| 国产精品对白交换视频 | 2欧美一区二区三区在线观看视频| 国产制服丝袜一区| 免费观看在线综合| 久久久精品日韩欧美| 91精品国产丝袜白色高跟鞋| 色视频一区二区| 国产一区二区三区四| 亚洲国产精品视频| 国产日产欧美一区二区三区 | 国产欧美久久久精品影院| 日韩电影在线观看电影| 一区二区三区在线看| 国产精品你懂的在线欣赏| 91在线视频官网| 午夜精品一区在线观看| 久久97超碰色| 国产一区二区三区香蕉| 青青青伊人色综合久久| 91精品国产综合久久婷婷香蕉| 欧美α欧美αv大片| 欧美电影在线免费观看| 国产精品三级视频| 秋霞成人午夜伦在线观看| 91黄色激情网站| 精品99一区二区| 亚洲一区视频在线观看视频| 国产大陆精品国产| 91精品国产欧美一区二区| 亚洲男女毛片无遮挡| 国产精品羞羞答答xxdd| 日韩女优电影在线观看| 一区二区三区在线免费视频| 国产东北露脸精品视频| 久久综合色天天久久综合图片| 亚洲国产一二三| 色综合久久88色综合天天6 | 91麻豆精品国产91久久久久久久久| 国产精品久久久久一区二区三区| 国产综合一区二区| 亚洲自拍都市欧美小说| 一区二区三区免费网站| 欧美三级日韩在线| 国产精品私人影院| 欧美日韩二区三区| 欧美三级视频在线观看| 亚洲天堂a在线| 中文av一区特黄| 国产精品色在线观看| 亚洲欧美电影院| 国产一区二区三区久久悠悠色av| 日韩一级完整毛片| 日韩黄色免费电影| 91精品国产欧美一区二区 | 精品国产伦一区二区三区观看体验| 亚洲综合另类小说| 欧美日韩一区二区电影| 亚洲成a人v欧美综合天堂| 欧美日韩精品欧美日韩精品| 亚洲美女免费视频| 在线观看不卡一区| 午夜精品一区在线观看| 欧美日本精品一区二区三区| 亚洲久草在线视频| 日本高清视频一区二区| 天天影视涩香欲综合网| 日韩视频免费直播| 极品少妇一区二区三区精品视频| 精品欧美乱码久久久久久1区2区 | 中文字幕一区二区三区精华液| 成人av电影免费在线播放| 亚洲免费在线视频| 91精品国产aⅴ一区二区| 激情六月婷婷久久| 亚洲人一二三区| 69久久夜色精品国产69蝌蚪网| 日本一区中文字幕| 精品粉嫩aⅴ一区二区三区四区| 丁香婷婷综合网| 一区二区三区在线高清| 99视频精品在线| 日韩欧美中文字幕制服| 国产精品自拍在线| 国产日韩高清在线| 99久久国产综合精品女不卡| 国产色产综合产在线视频| 秋霞午夜av一区二区三区| 日韩欧美黄色影院| 国产福利一区二区三区| 欧美国产在线观看| 欧美日韩精品电影| 91久久精品网| 国产成人综合在线| 天天影视涩香欲综合网| 欧美片网站yy| 国产成人免费高清| 成人久久视频在线观看| 久久精品一区四区| 麻豆成人久久精品二区三区小说| 久久精品国产免费看久久精品| 91麻豆精品国产91久久久久久| 日韩精品一区二区三区四区 | 自拍偷在线精品自拍偷无码专区| 91福利国产精品| 东方aⅴ免费观看久久av| 免费看黄色91| 国产在线一区二区综合免费视频| 丝袜美腿亚洲综合| 91久久精品国产91性色tv| 午夜婷婷国产麻豆精品| 久久综合久久综合亚洲| 精品视频免费看| 久久久久久综合| 欧美喷潮久久久xxxxx| 波多野结衣亚洲一区| 久久精品一区二区三区av| 中文无字幕一区二区三区| 国产一区不卡视频| 久久免费国产精品| 精品视频一区 二区 三区| 久久成人综合网| 天天色天天操综合| 国产精品久线在线观看| 久久99精品视频| 欧美剧情电影在线观看完整版免费励志电影| 一区二区日韩av| 久久蜜桃av一区精品变态类天堂| 免费国产亚洲视频| 美国欧美日韩国产在线播放| 国产精品一区久久久久| 亚洲一二三四久久| 在线观看日韩av先锋影音电影院| 日韩成人av影视| 国产精品夫妻自拍| 色综合久久久久综合体桃花网| 国产传媒日韩欧美成人| 国产精品夜夜嗨| 91亚洲大成网污www| 精品国产亚洲在线| 日韩黄色片在线观看| 欧美巨大另类极品videosbest| 国产精品美女一区二区在线观看| 久草热8精品视频在线观看| 日本韩国一区二区三区视频| 日韩视频一区在线观看| 久久久亚洲欧洲日产国码αv| 精品美女一区二区三区| 久久久无码精品亚洲日韩按摩| 中文字幕在线一区免费| 日韩激情av在线| 国产成人一区二区精品非洲| 中文字幕在线视频一区| 亚洲成a人v欧美综合天堂下载 |