日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:231日期:2022-06-24 11:14:40

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

import pandas as pdimport numpy as npimport randomimport osimport matplotlib.pyplot as pltimport seaborn as snsfrom scipy.spatial.distance import cdistfrom itertools import combinationsfrom joblib import Parallel, delayedfrom tqdm import tqdm數(shù)據(jù)讀取

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

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值是一個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ù),前面讀取到的地址也是一個DataFrame,選擇你想要進行聚類的數(shù)據(jù)讀取進來。

#讀取你想要的數(shù)據(jù)idxs = [0,1,2]data = read_data(data_path,idxs)定義不同軌跡間的距離

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

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

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

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

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

def DistanceMat(data,w=[0.7,0.2,0.1]): ’’’ 功能:計算軌跡段的距離矩陣 輸出:距離矩陣 ’’’ #要計算的組合 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ù),計算不同軌跡間的距離矩陣,缺點在于計算時間會隨著軌跡數(shù)的增大而指數(shù)增長。

distancemat = DistanceMat(data,w=[0.7,0.2,0.1])k-means聚類

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

#聚類,保存不同的sseSSE = []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é)果進行聚類n_clusters=12kmeans = KMeans(n_clusters=n_clusters,Q=0.01,max_iter=150)kmeans.fit(distancemat)kmeans.sse #輸出ssekmeans.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()#保存每一個軌跡屬于哪一類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軌跡聚類的實現(xiàn)的文章就介紹到這了,更多相關(guān)python K-means軌跡聚類內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品日本一区二区三区在线| 午夜性色一区二区三区免费视频| 亚洲国产成人精品女人| 日韩三区免费| 麻豆一区二区三| 九九九精品视频| 欧美日韩视频网站| 国产91精品对白在线播放| 在线视频观看日韩| 国产亚洲在线| 国产精品亚洲综合久久| 国产激情在线播放| 免费观看久久av| 日韩精品亚洲一区二区三区免费| 国产亚洲高清在线观看| 韩国一区二区三区视频| 日韩中文首页| 久久最新视频| 欧美精品第一区| 午夜久久中文| 视频在线观看一区二区三区| 日韩精品电影一区亚洲| 久久精品系列| 9国产精品视频| 国产精品mv在线观看| bbw在线视频| 国产精品普通话对白| 日本视频在线一区| 日韩精品一区二区三区免费观看| 久久亚洲一区| 日韩在线观看一区| 欧美日韩1区| 亚洲调教视频在线观看| 日韩av一二三| 久久久一本精品| 婷婷综合国产| 五月精品视频| 欧美国产小视频| 日韩精品一区二区三区中文字幕| 国产一二在线播放| 日韩精品国产欧美| 国产亚洲精品久久久久婷婷瑜伽| 国产精品99久久免费| 天堂av在线一区| 色网在线免费观看| 国产乱人伦精品一区| 亚洲激情社区| 国产99久久久国产精品成人免费| 欧美日韩1区| 亚欧洲精品视频在线观看| 福利欧美精品在线| 国产精品久久久久久模特| 中文字幕亚洲精品乱码| 欧美精品羞羞答答| 女生影院久久| 91看片一区| 欧美sm一区| av中文字幕在线观看第一页| 精品视频一区二区三区四区五区 | 亚洲免费资源| 婷婷亚洲综合| 一区在线免费观看| 91久久视频| 在线亚洲国产精品网站| 欧美性感美女一区二区| 久久精品国产www456c0m| 日韩在线高清| 九九综合九九| 羞羞答答国产精品www一本| 快she精品国产999| 日韩欧美中文在线观看| 日韩精品一区二区三区免费视频| 日本少妇精品亚洲第一区| 国产精品一线| 久久中文欧美| 久久久精品午夜少妇| 91九色精品| 欧美一区91| 中文另类视频| 国产毛片精品| 精品在线99| 色8久久久久| 久久伊人久久| jiujiure精品视频播放| 欧美亚洲福利| 日韩av黄色在线| 亚洲黄色影院| 日韩午夜av在线| 日日夜夜免费精品视频| 亚洲狼人精品一区二区三区| 国产精品久久久久久久久久久久久久久| 日韩1区2区| 蜜桃视频在线观看一区| 免费日韩成人| 在线亚洲自拍| 国产一区二区视频在线看| 女人天堂亚洲aⅴ在线观看| 国产视频一区二| 成人啊v在线| 日韩精品免费一区二区夜夜嗨 | 日本亚洲视频在线| 久久久久久婷| 亚洲区第一页| 欧美 日韩 国产精品免费观看| 日韩欧美中文字幕一区二区三区| 国产精品蜜芽在线观看| 蜜桃免费网站一区二区三区| 福利精品在线| 91成人精品在线| 中文字幕一区二区精品区| 久久青草久久| 国产 日韩 欧美 综合 一区| 亚洲精品福利| 午夜在线一区| 亚洲国产日韩欧美在线| 欧美91在线| 国产欧美久久一区二区三区| 黑丝一区二区三区| 91精品国产成人观看| 久久麻豆视频| 国产精品高潮呻吟久久久久| 综合精品一区| 三级欧美韩日大片在线看| 国产综合欧美| 偷拍欧美精品| 老色鬼久久亚洲一区二区| 激情五月综合网| 欧美日韩精品免费观看视频完整 | 国产亚洲一区| 亚洲区第一页| 日本视频中文字幕一区二区三区| 日韩欧美激情| 国产精品亚洲欧美一级在线| 欧美一区二区三区免费看| 亚洲香蕉视频| 日韩高清在线观看一区二区| 日韩中文字幕一区二区高清99| 亚洲免费专区| 国产精品亚洲四区在线观看| 国产精品久久久久久久久久妞妞 | 国产专区精品| 国产不卡精品| 99久久亚洲精品蜜臀| 欧美女激情福利| 亚洲日韩中文字幕一区| 欧美一区成人| 极品av在线| 亚洲激情国产| 国产日韩中文在线中文字幕| 欧美激情在线精品一区二区三区| 麻豆国产精品| 久久久久午夜电影| 亚洲精品自拍| 精品午夜av| 国产亚洲精品v| 国产精品亚洲二区| 国内自拍视频一区二区三区| 亚洲国产一区二区在线观看| 日韩精品视频网| 精品捆绑调教一区二区三区| 国产精品婷婷| 久久精品国产久精国产| 极品日韩av| 欧美a在线观看| 国产精品女主播一区二区三区| 国产精品天天看天天狠| 成人久久一区| 国产精品一区二区三区av| 亚洲成av在线| 国产福利一区二区三区在线播放| 国产专区一区| 国产不卡人人| 日韩一区二区三区免费视频| 国产96在线亚洲| 国产欧美日韩精品一区二区免费 | 免费在线欧美黄色| 日av在线不卡| 亚洲精品小说| 精品捆绑调教一区二区三区| 国产日韩三级| 亚洲专区视频| 蜜桃tv一区二区三区| 成人污污视频| 国产精品免费99久久久| 亚洲精品一级| 中文一区一区三区免费在线观 | 久久99蜜桃| 91精品国产自产观看在线| 欧美粗暴jizz性欧美20| 日韩影院二区| 免费一二一二在线视频| 欧美精品福利| 国产亚洲精品美女久久 | 夜夜嗨一区二区| 欧美特黄a级高清免费大片a级| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 国产精品一区高清| 日本成人精品| 日本aⅴ亚洲精品中文乱码| 国产在线成人|