✅作者简介:热爱科研的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);
⛄ 运行结果