【航迹识别】基于改进的 Hausdorff 距离的DBSCAN船舶异常行为识别附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信       无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机 

⛄ 内容介绍

​随着海上交通量的迅猛增长以及海上交通环境日益复杂,船舶在生产活动中产生的时空轨迹也越来越多,如何对船舶异常轨迹进行有效的监控与管理,及时发现异常轨迹,是实现海上智能交通的关键技术之一,而及时发现异常轨迹的前提为获得船舶典型运动轨迹。由于传统的海上交通调查方法费时费力,且效率低下。而基于海量的船载AIS信息集合蕴藏着大量的海上交通特征,从中获取能够反映船舶行为规律的、有效的、潜在的信息,有利于进行海上交通调查获取数据信息。

⛄ 部分代码

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邻域距离 = ' num2str(eps) ', 最小样本数 = ' num2str(MinNum) '\n航迹类别:' num2str(cluster_num) '类,噪声航迹:' num2str(noisenum) '条']));

xlabel('经度')

ylabel('维度')

% 逐类计数典型轨迹

filename='典型轨迹数据.xlsx';

DXcolor={'black','magenta'};

DXindexlist=[15,36];

Legendslist={'主航道出口船舶典型轨迹','主航道进口船舶典型轨迹'};

for k=1:cluster_num

    data_ind=[];

    temp_trace_ind=find(cluster_label==k);

    for t=1:length(temp_trace_ind)

        data_ind1=find(data1(:,1)==temp_trace_ind(t));

        data_ind=[data_ind;data_ind1];

    end

    %     Legendsname = ['第' num2str(k) '类航迹的典型航迹'];

    Legendsname=Legendslist{k};

    [DXfinalData{k},DXdatanew{k},DXpx{k},DXfData{k},DXMapDis{k},DXMapV{k},DXMapHeading{k}]=DXGJ(data1(data_ind,:),DXcolor{k},Legendsname,DXindexlist(k));

    datawriter(filename,DXfData{k},Legendsname)% end

end

% %%

% addpath '识别数据集'

% filename_train_in1='进口正常行为数据.xlsx';

% filename_train_in0='进口异常行为数据.xlsx';

addpath '正常与异常数据'

filename_train_in1='进口正常轨迹数据.xlsx';

filename_train_in0='进口异常轨迹数据.xlsx';

[data_in1,finalData_in1]=makeData(filename_train_in1);

[data_in0,finalData_in0]=makeData(filename_train_in0);

stepNum=20;

DistThre=linspace(1,250,stepNum);

SogThre=linspace(1,8,stepNum);

CogThre=linspace(1,8,stepNum);

%

% DistThre=1:0.01:250;

DXTrace=DXfData{2};

% ACC_P=[];

% ACC_S=[];

% ACC_C=[];

for i=1:stepNum

    tDistThre=DistThre(i);

    tSogThre=SogThre(i);

    tCogThre=CogThre(i);

    [ACC_P(i),ACC_S(i),ACC_C(i)]=drawErrerRate(finalData_in1,finalData_in0,DXTrace,tDistThre,tSogThre,tCogThre);

end

%% 

filename='阈值.xlsx';

data=xlsread(filename);

figure

plot(DistThre,[ACC_P.r],'-gp','DisPlayName','准确率')

hold on

plot(DistThre,1-[ACC_P.r],'-rd','DisPlayName','误警率')

xlabel('位置偏差')

legend

figure

plot(SogThre,[ACC_S.r],'-gp','DisPlayName','准确率')

hold on

plot(SogThre,1-[ACC_S.r],'-rd','DisPlayName','误警率')

xlabel('航速偏差')

legend

figure

plot(CogThre,[ACC_C.r],'-gp','DisPlayName','准确率')

hold on

plot(CogThre,1-[ACC_C.r],'-rd','DisPlayName','误警率')

xlabel('航向偏差')

legend

% 2类:进口 1类出口

global DistThre SogThre CogThre

DistThre=60;

SogThre=2.8;

CogThre=3.8;

addpath '正常与异常数据'

filename_in='验证进口道船舶异常行为.xlsx';

tracetype=input('请选择要验证的船舶类型:1(出口)/ 2(进口)');

try

DXTrace=DXfData{tracetype};

catch

    disp('输入错误')

    return

end

checkTrace(filename_in,DXTrace);

⛄ 运行结果

⛄ 参考文献

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除

❤️ 关注我领取海量matlab电子书和数学建模资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值