【Matlab】基于改进的 Hausdorff 距离的DBSCAN船舶航迹聚类
一、模型简介
1.1问题背景
作者复现了《基于轨迹聚类的船舶异常行为识别研究_胡智辉》的文章内容,对模型感兴趣的朋友可以下载文章深入研究。本文主要是分享复现过程中的算法实现。
1.2具体内容
本模型通过处理AIS数据得到船舶轨迹,通过计算改进的 Hausdorff 距离,对轨迹进行DNSCAN聚类,得到不同类型的航迹簇。主要包含以下内容
AIS数据的预处理
船舶轨迹分割
船舶轨迹相似度度量
船舶轨迹表达方式
船舶轨迹相似度量方法
改进的 Hausdorff 距离
船舶轨迹聚类及轨迹提取
基于改进DBSCAN算法轨迹聚类
船舶典型轨迹的提取
船舶轨迹聚类效果对比
二、代码分享
具体的代码原理比较繁琐,笔者时间精力有限,难以详尽描述,有需要的可以私信咨询。这里就直接分享部分源码
2.1主函数
% clc
% close all
% clear all
% % %%
% % global noisenum
% % % %% 数据路径
% % % path='AIS1246-1.CSV';
% % % %% 计算H距离
% % % [data1,px,tempMapDis,tempMapV,tempMapHeading]=myHuasdoff(path);
% % % Hdist = (tempMapDis + tempMapV + tempMapHeading) / 3;
% % % %% 取距离中的较小值
% % % for i = 1 : size(Hdist,1)
% % % for j = i + 1 : size(Hdist,2)
% % % max1 = Hdist(i,j);
% % % if max1 < Hdist(j,i)
% % % max1 = Hdist(j,i);
% % % end
% % % Hdist(i,j) = max1;
% % % Hdist(j,i) = max1;
% % % end
% % % end
% load data.mat
% %% 设置聚类参数
% eps=0.056;
% MinNum=18;
% %% DBscan 聚类
% cluster_label=DBSCAN(Hdist,eps,MinNum);
% %% 计算聚类数
% cluster_num=max(cluster_label);
% %% 计算轨迹平均位置
% meanpos=zeros(length(cluster_label),2);
% for i=1:length(cluster_label)
% meanpos(i,1)=mean(data1(data1(:,1)==i,2));
% meanpos(i,2)=mean(data1(data1(:,1)==i,3));
% end
% %% 画图
% % %% plot trace
% figure
% Plottrace(data1,cluster_label)
% title(sprintf(['DBSCAN聚类结果(航迹示意图) \n邻域距离 = ' num2str(eps) ', 最小样本数 = ' num2str(MinNum) '\n航迹类别:' num2str(cluster_num) '类,噪声航迹:' num2str(noisenum) '条']));
% xlabel('经度')
% ylabel('纬度')
% %% plot meanpos
% % figure
% % Plotmeanpos(meanpos, cluster_label);
% % title(sprintf(['DBSCAN聚类结果(航迹平均坐标示意图) \n邻域距离