电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

python 基于空間相似度的K-means軌跡聚類的實現

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

這里分享一些軌跡聚類的基本方法,涉及軌跡距離的定義、kmeans聚類應用。需要使用的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數據讀取

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

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

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

#設置數據根目錄path = ’yourpath’#獲取所有數據地址data_path = get_alldata_path(path)

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

def read_data(data_path,idxs): ’’’ 功能:讀取數據 ’’’ 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

讀取你想要的數據,前面讀取到的地址也是一個DataFrame,選擇你想要進行聚類的數據讀取進來。

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

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

python 基于空間相似度的K-means軌跡聚類的實現

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

def OneWayHausdorffDistance(ptSetA, ptSetB): # 計算任意向量之間的距離,假設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) 計算距離矩陣

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

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

使用前面讀取的數據,計算不同軌跡間的距離矩陣,缺點在于計算時間會隨著軌跡數的增大而指數增長。

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

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

class KMeans: def __init__(self,n_clusters=5,Q=74018,max_iter=150): self.n_clusters = n_clusters #聚類數 self.Q = Q self.max_iter = max_iter # 最大迭代數 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] #選擇最小的樣本組合為初始質心 self._init_center = center_init #迭代停止條件 iter_ = 0 run = True #開始迭代 while (iter_<self.max_iter)&(run==True): #聚類聚類標簽更新 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() #記錄數據 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)])

應用聚類,根據平方誤差和SSE結合手肘法確定最佳的聚類數,使用最佳的聚類數獲得最后聚類模型。

#聚類,保存不同的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()#使用最好的結果進行聚類n_clusters=12kmeans = KMeans(n_clusters=n_clusters,Q=0.01,max_iter=150)kmeans.fit(distancemat)kmeans.sse #輸出ssekmeans.labels_ #輸出標簽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()]

到此這篇關于python 基于空間相似度的K-means軌跡聚類的實現的文章就介紹到這了,更多相關python K-means軌跡聚類內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 慢回弹测试仪-落球回弹测试仪-北京冠测精电仪器设备有限公司 | 硬度计_影像测量仪_维氏硬度计_佛山市精测计量仪器设备有限公司厂家 | 吸音板,隔音板,吸音材料,吸音板价格,声学材料 - 佛山诺声吸音板厂家 | 石英陶瓷,石英坩埚,二氧化硅陶瓷-淄博百特高新材料有限公司 | 隔离变压器-伺服变压器--输入输出电抗器-深圳市德而沃电气有限公司 | 大型果蔬切片机-水果冬瓜削皮机-洗菜机切菜机-肇庆市凤翔餐饮设备有限公司 | 合肥网带炉_安徽箱式炉_钟罩炉-合肥品炙装备科技有限公司 | 上海深蓝_缠绕机_缠膜机-上海深蓝机械装备有限公司 | 广东护栏厂家-广州护栏网厂家-广东省安麦斯交通设施有限公司 | 鲁尔圆锥接头多功能测试仪-留置针测试仪-上海威夏环保科技有限公司 | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 选矿设备-新型重选设备-金属矿尾矿重选-青州冠诚重工机械有限公司 | 苏州西朗门业-欧盟CE|莱茵UL双认证的快速卷帘门品牌厂家 | 北京成考网-北京成人高考网 | 安徽成考网-安徽成人高考网| 粘度计NDJ-5S,粘度计NDJ-8S,越平水分测定仪-上海右一仪器有限公司 | Copeland/谷轮压缩机,谷轮半封闭压缩机,谷轮涡旋压缩机,型号规格,技术参数,尺寸图片,价格经销商 CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 不发火防静电金属骨料_无机磨石_水泥自流平_修补砂浆厂家「圣威特」 | 温州在线网 | 螺旋绞龙叶片,螺旋输送机厂家,山东螺旋输送机-淄博长江机械制造有限公司 | 智能型高压核相仪-自动开口闪点测试仪-QJ41A电雷管测试仪|上海妙定 | 芜湖厨房设备_芜湖商用厨具_芜湖厨具设备-芜湖鑫环厨具有限公司 控显科技 - 工控一体机、工业显示器、工业平板电脑源头厂家 | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 | 电采暖锅炉_超低温空气源热泵_空气源热水器-鑫鲁禹电锅炉空气能热泵厂家 | 口信网(kousing.com) - 行业资讯_行业展会_行业培训_行业资料 | 低压载波电能表-单相导轨式电能表-华邦电力科技股份有限公司-智能物联网综合管理平台 | 特材真空腔体_哈氏合金/镍基合金/纯镍腔体-无锡国德机械制造有限公司 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 硬度计,金相磨抛机_厂家-莱州华煜众信试验仪器有限公司 | 山东商品混凝土搅拌楼-环保型搅拌站-拌合站-分体仓-搅拌机厂家-天宇 | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 首页-浙江橙树网络技术有限公司 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 土壤肥料养分速测仪_测土配方施肥仪_土壤养分检测仪-杭州鸣辉科技有限公司 | 杭州ROHS检测仪-XRF测试仪价格-百科 | 不锈钢轴流风机,不锈钢电机-许昌光维防爆电机有限公司(原许昌光维特种电机技术有限公司) | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 螺旋绞龙叶片,螺旋输送机厂家,山东螺旋输送机-淄博长江机械制造有限公司 | 磁力链接搜索神器_BT磁力狗_CILIMAO磁力猫_高效磁力搜索引擎2024 | 新疆乌鲁木齐网站建设-乌鲁木齐网站制作设计-新疆远璨网络 |