【Matlab】基于改进的 Hausdorf 距离的DBSCAN船舶航迹聚类

news2024/9/22 17:28:43

【Matlab】基于改进的 Hausdorff 距离的DBSCAN船舶航迹聚类

  • 一、模型简介
    • 1.1问题背景
    • 1.2具体内容
      • AIS数据的预处理
      • 船舶轨迹分割
      • 船舶轨迹相似度度量
      • 船舶轨迹表达方式
      • 船舶轨迹相似度量方法
      • 改进的 Hausdorff 距离
      • 船舶轨迹聚类及轨迹提取
      • 基于改进DBSCAN算法轨迹聚类
      • 船舶典型轨迹的提取
      • 船舶轨迹聚类效果对比
  • 二、代码分享
    • 2.1主函数
    • 2.1 计算H距离
    • 2.2 DBSCAN聚类
    • 2.3提取典型轨迹
    • 2.4 根据聚类结果 进行航迹预测
    • 三、结果展示
      • 3.1DBSCAN聚类结果
      • 3.2 典型航迹提取
      • 3.2 航迹阈值分类
      • 3.2 最佳分类阈值
    • 四、代码分享

一、模型简介

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邻域距离 = ' 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);```



2.1 计算H距离

function [data1,px,tempMapDis,tempMapV,tempMapHeading]=myHuasdoff(datapath)
data1 = xlsread(datapath); 
[sy,sx] = size(data1);
tempx = 1;tempy = 1;
global finalData;
finalData{1,1} = data1(1,:);
px(1,1) = 1;
px(1,2) = data1(1,1);
for i = 2 : sy
    if data1(i,1) ~= data1(i - 1,1)
        tempx = tempx + 1;
        px(tempx,1) = tempx;px(tempx,2) = data1(i,1);
        finalData{tempx,1} = data1(i,:);
        tempy = 1;
    else
        tempy = tempy + 1;
        finalData{tempx,tempy} = data1(i,:);
    end
end
global n;
global yy;
xx = size(finalData,1);
yy = size(finalData,2);
n = xx;
tempMapDis = zeros(n,n);
tempMapV = zeros(n,n);
tempMapHeading = zeros(n,n);
%%计算最小值
for i = 1 : xx
    for j = 1 : xx
       ......
    end
end
%%归一化
for i = 1 : n
    for j = 1 : n
... ...
        end
    end
end
disGy = disGy - disMin;
vGy = vGy - vMin;
headingGy = headingGy - headingMin;
for i = 1 : n
    for j = 1 : n
 ......
    end
end

end

2.2 DBSCAN聚类

function [labels, isnoise]=DBSCAN(D,epsilon,MinPts)
    C=0;
    n=size(D,1);
    labels=zeros(n,1);
%     D=pdist2(X,X);
%     D=X;
    visited=false(n,1);
    isnoise=false(n,1);
    for i=1:n
        if ~visited(i)
            visited(i)=true;
            
            Neighbors=RegionQuery(i);
            if numel(Neighbors)<MinPts
                % X(i,:) is NOISE
                isnoise(i)=true;
            else
                C=C+1;
                ExpandCluster(i,Neighbors,C);
            end
            
        end
    
    end
    
    function ExpandCluster(i,Neighbors,C)
        labels(i)=C;
        
        k = 1;
        while true
            j = Neighbors(k);
            
            if ~visited(j)
                visited(j)=true;
                Neighbors2=RegionQuery(j);
                if numel(Neighbors2)>=MinPts
                    Neighbors=[Neighbors Neighbors2];   %#ok
                end
            end
            if labels(j)==0
                labels(j)=C;
            end
            
            k = k + 1;
            if k > numel(Neighbors)
                break;
            end
        end
    end
    
    function Neighbors=RegionQuery(i)
    end

2.3提取典型轨迹

%求同一簇典型轨迹
function [finalData1,data1,px,fData,tempMapDis,tempMapV,tempMapHeading]=DXGJ(data1,DXcolor,DXlegend,DXindex)
% function main()
%%数据预处理
% data1 = xlsread(path); %xls xlsx
%    data1 = csvread('1.csv'); %csv
[sy,sx] = size(data1);
tempx = 1;tempy = 1;
global finalData;
finalData=[];
finalData{1,1} = data1(1,:);
px(1,1) = 1;
px(1,2) = data1(1,1);
for i = 2 : sy
    if data1(i,1) ~= data1(i - 1,1)
        tempx = tempx + 1;
        px(tempx,1) = tempx;px(tempx,2) = data1(i, 1);
        finalData{tempx,1} = data1(i,:);
        tempy = 1;
    else
        tempy = tempy + 1;
        finalData{tempx,tempy} = data1(i,:);
    end
end

finalData1 = finalData;
%画出船舶轨迹线
% for i = 1 : length(data1(:,1)) - 1
%     if data1(i,1) == data1(i + 1,1)
%         line([data1(i,2) data1(i + 1,2)],[data1(i,3) data1(i + 1,3)]);
%         hold on
%     end
% end
% hold on

global a;
a=DXindex;
global xx;
global yy;
xx = size(finalData,1);
yy = size(finalData,2);
tempX = [];
tempY = [];
tempH = [];
tempV = [];

%%计算交点
for k = 1 : yy
    if isempty(finalData{a,k})
        break;
    end
    [t1,t2,t3,t4] = toIntersection(k);
    if t1 == -1
        continue;
    end
    tempX = [tempX,t1];
    tempY = [tempY,t2];
    tempH = [tempH,t3];
    tempV = [tempV,t4];
end
hold on;
plot(tempX,tempY,'Color',DXcolor,'LineWidth',1,'DisPlayName',DXlegend) %典型轨迹的划线
hold on;
fData ={};
for i = 1 : size(tempX,2)
    temp = [tempX(i),tempY(i),tempH(i),tempV(i)];
    fData{1,i} = temp;
    temp = [1,temp];
    finalData{xx + 1,i} = temp;
end
xx = size(finalData,1);
yy = size(finalData,2);
n = xx;
tempMapDis = zeros(1,n - 1);
tempMapV = zeros(1,n - 1);
tempMapHeading = zeros(1,n - 1);

%%计算最小值
for j = 1 : xx - 1
    totalDis = 0;
    totalV = 0;
    totalHeading = 0;
    len = 0;
    for k = 1 : yy
        if isempty(finalData{xx,k})
            break;
        end
        min1 = 999999999;
        minl = -1;
        for l = 1 : yy
            if isempty(finalData{j,l})
                break;
            end
            if min1 > osDis(xx,k,j,l)
                min1 = osDis(xx,k,j,l);
                minl = l;
            end
        end
        [t1,t2,t3] = toMinDis(xx,k,j,minl);
        t2 = abs(t2 - finalData{xx,k}(4));
        t3 = abs(t3 - finalData{xx,k}(5));
        totalDis = totalDis + t1;
        totalHeading = totalHeading + t2;
        totalV = totalV + t3;
        len = len + 1;
    end
    tempMapDis(1,j) = totalDis / len;
    tempMapV(1,j) = totalV / len;
    tempMapHeading(1,j) = totalHeading / len;
end
end

2.4 根据聚类结果 进行航迹预测

function [ACC_P,ACC_S,ACC_C]=drawErrerRate(finalData_in1,finalData_in0,DXTrace,DistThre,SogThre,CogThre)
% DistThre=60;
% SogThre=2.8;
% CogThre=3.8;
% filename_train_in1='进口正常轨迹数据.xlsx';
% filename_train_in0='进口异常轨迹数据.xlsx';
% [data_in1,finalData_in1]=makeData(filename_train_in1);
% [data_in0,finalData_in0]=makeData(filename_train_in0);
% pred_label_in1_P=zeros(length(finalData_in1),1);
% pred_label_in0_P=zeros(length(finalData_in0),1);
% pred_label_in1_S=zeros(length(finalData_in1),1);
% pred_label_in0_S=zeros(length(finalData_in0),1);
% pred_label_in1_C=zeros(length(finalData_in1),1);
% pred_label_in0_C=zeros(length(finalData_in0),1);
TP_P=0;
FP_P=0;
TN_P=0;
FN_P=0;

TP_S=0;
FP_S=0;
TN_S=0;
FN_S=0;

TP_C=0;
FP_C=0;
TN_C=0;
FN_C=0;
for ind=1:size(finalData_in1,1)
    currentTrace=finalData_in1(ind,:);

    % DXTrace=DXfData{t};
    [DevPosition,DevSog,DevCog]=getDev(currentTrace,DXTrace);
        pred_label_in_P=zeros(length(DevPosition),1);
    pred_label_in_S=zeros(length(DevSog),1);
    pred_label_in_C=zeros(length(DevCog),1);
    for node=1:length(DevPosition)
        if DevPosition(node)<DistThre
            pred_label_in_P(node)=1;
        end
        if DevSog(node)<SogThre
            pred_label_in_S(node)=1;
        end
        if DevCog(node)<CogThre
            pred_label_in_C(node)=1;
        end
    end
    %% 找到偏离点
    errerind_P=find(pred_label_in_P==0);
    diff1_P=diff(diff(errerind_P));
    if isempty(find(diff1_P==0))
        TP_P=TP_P+1;
%         max(DevPosition)
    else
        FN_P=FN_P+1;
    end
    %%
    %% 找到偏离点
    errerind_S=find(pred_label_in_S==0);
    diff1_S=diff(diff(errerind_S));
    if isempty(find(diff1_S==0))
        TP_S=TP_S+1;
    else
        FN_S=FN_S+1;
    end
    %%
    %% 找到偏离点
    errerind_C=find(pred_label_in_C==0);
    diff1_C=diff(diff(errerind_C));
    if isempty(find(diff1_C==0))
        TP_C=TP_C+1;
    else
        FN_C=FN_C+1;
    end
end

%%
for ind=1:size(finalData_in0,1)
    currentTrace=finalData_in0(ind,:);

    % DXTrace=DXfData{t};
    [DevPosition,DevSog,DevCog]=getDev(currentTrace,DXTrace);
        pred_label_in_P=zeros(length(DevPosition),1);
    pred_label_in_S=zeros(length(DevSog),1);
    pred_label_in_C=zeros(length(DevCog),1);
    for node=1:length(DevPosition)
        if DevPosition(node)<DistThre
            pred_label_in_P(node)=1;
        end
        if DevSog(node)<SogThre
            pred_label_in_S(node)=1;
        end
        if DevCog(node)<CogThre
            pred_label_in_C(node)=1;
        end
    end
    %% 找到偏离点
    errerind_P=find(pred_label_in_P==0);
    diff1_P=diff(diff(errerind_P));
    if isempty(find(diff1_P==0))
        FP_P=FP_P+1;
    else
        TN_P=TN_P+1;
    end
    %%
    %% 找到偏离点
    errerind_S=find(pred_label_in_S==0);
    diff1_S=diff(diff(errerind_S));
    if isempty(find(diff1_S==0))
        FP_S=FP_S+1;
    else
        TN_S=TN_S+1;
    end
    %%
    %% 找到偏离点
    errerind_C=find(pred_label_in_C==0);
    diff1_C=diff(diff(errerind_C));
    if isempty(find(diff1_C==0))
        FP_C=FP_C+1;
    else
        TN_C=TN_C+1;
    end
end

ACC_P.r=(TP_P+TN_P)/(TP_P+TN_P+FP_P+FN_P);
ACC_S.r=(TP_S+TN_S)/(TP_S+TN_S+FP_S+FN_S);
ACC_C.r=(TP_C+TN_C)/(TP_C+TN_C+FP_C+FN_C);
ACC_P.TP=TP_P;
ACC_P.TN=TN_P;
ACC_P.FP=FP_P;
ACC_P.FN=FN_P;

ACC_S.TP=TP_S;
ACC_S.TN=TN_S;
ACC_S.FP=FP_S;
ACC_S.FN=FN_S;

ACC_C.TP=TP_C;
ACC_C.TN=TN_C;
ACC_C.FP=FP_C;
ACC_C.FN=FN_C;

三、结果展示

本文的过程相对来说比较复杂,结果也比较多,主要将后期可视化的结果进行展示,完整的数据处理过程和相关结果见第四部分代码分享。

3.1DBSCAN聚类结果

DBSCAN聚类结果
在这里插入图片描述

3.2 典型航迹提取

在这里插入图片描述

3.2 航迹阈值分类

在这里插入图片描述

3.2 最佳分类阈值

在这里插入图片描述

四、代码分享

源码链接:C币下载
需要免费分享的关注+点赞+收藏的 私聊领取
完整的项目内容
包含:
模型文件和航迹数据
DBSCAN代码
H距离计算代码
航迹提取代码
基于H距离的阈值分类代码
阈值寻优代码
均可直接运行

可以结合这个案例,学习DBSCAN距离算法和H距离的计算方法,掌握了航迹分类的大致流程,取得了较好的聚类效果,并基于航迹聚类进行航迹偏离预测,经检测准确率较高。
需要学习DBSCAN的朋友可以当作一个应用案例来学习,船舶航迹研究方向的朋友可以通过替换数据和相关模块实现拓展成自己的模型实现

在这里插入图片描述

参考文献
[1]:基于轨迹聚类的船舶异常行为识别研究
胡智辉
[2]:Typical trajectory extraction method for ships based on AIS data
and trajectory clustering
Huaipeng Li∗
Beijing Industry University, Beijing, China

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/494283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP+vue基于web的小区物业管理管理系统1995a

小区物业管理系统主要是对小区物业以及居民信息进行管理&#xff0c;方便用户使用该资源的一种有效手段。能有效地对物业以及用户信息进行管理并为广大用户服务是该管理系统的基本要求&#xff0c;同时用户也可以及时了解最新的物业信息&#xff0c;方便地查询相关物业情况。基…

Django配置WebSocket:django3配置websocket步骤

一、websocket概述 简单可以认为是在web上实现socket功能&#xff0c;在服务器上与浏览器保持socket长连接。 实现websocket是通过magic string 二、环境概述 解释器&#xff1a;python3.9 django3.2 channels3.0.4 #有些时候是channels版本有问题&#xff0c;导致配置不…

linux和window下svn版本控制可视化工具

之前一直用命令行来拉取代码建立分支&#xff0c;推送代码等等 也不是不行&#xff0c;但是用久了&#xff0c;感觉很麻烦&#xff0c;后面就用了svn的版本可视化工具 linux和window下svn版本控制可视化工具 Linux环境下使用图形化界面的SVN客户端软件&#xff0c;那么RabbitVC…

触控笔和电容笔哪个好用?ipad第三方电容笔了解下

和最早出现的那一些触控笔相比&#xff0c;现在电容笔最大的不同之处在于&#xff0c;这些电容笔具备了防误触、倾斜可以随意调整笔迹粗细的特性。苹果的Pencil&#xff0c;现在的价格&#xff0c;也是非常高的。所以&#xff0c;对于预算不足的人群来说&#xff0c;平替电容笔…

SDMTSP:斑马优化算法ZOA求解单仓库多旅行商问题(提供MATLAB代码,可更改起点及旅行商个数)

一、单仓库多旅行商问题 单仓库多旅行商问题&#xff08;Single-Depot Multiple Travelling Salesman Problem, SD-MTSP&#xff09;&#xff1a;&#x1d45a;个推销员从同一座中心城市出发&#xff0c;访问其中一定数量的城市并且每座城市只能被某一个推销员访问一次&#x…

安装java配置

目录 安装JDK ​编辑 环境变量配置 3、检验环境变量配置 二、安装tomcat 验证Tomcat配置是否成功 三、安装Mysql 一、安装 二、卸载 安装JDK 点击更改将C直接给为F即可。 点击确定后进行安装&#xff0c;安装完以后会提示安装JRE; 检测是否已经安装JDK的方法 java命令通…

尚硅谷-宋红康-JVM上中下篇完整笔记-JVM上篇_内存与垃圾回收篇

前言 一.jvm及java体系结构 1. Java及JVM简介 TIOBE语言热度排行榜 https://www.tiobe.com/tiobe-index/ 世界上没有最好的编程语言&#xff0c;只有最适用于具体应用场景的编程语言。 java: 跨平台的语言JVM: 跨语言的平台 随着Java7的正式发布,Java虚拟机的设计者们通过JS…

【周末闲谈】什么是云计算?

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️周末闲谈】 ✨第一周 二进制VS三进制 ✨第二周 文心一言&#xff0c;模仿还是超越&#xff1f; ✨第二周 畅想AR 文章目录 前言什么是云计算&#xff1f;&#x1f914;&#x1f914;&#x1f914;大数…

【Linux】进程信号(中)

在上一个文章中&#xff0c;关于信号的产生&#xff0c;还有没补充完的&#xff0c;所以在这篇文章补充一下 文章目录 1.信号的产生硬件异常产生信号a/0问题验证为8号信号 野指针问题验证为11号信号 核心转储设置核心转储大小Core与Term的区别核心转储的作用 2.信号保存1. 概念…

Windows搭建C++开发环境(visual studio 2022)

开发环境的搭建 开发工具&#xff1a;vscode、visual studio 2022、visual studio 2019、2015、2010 .. 安装步骤&#xff08;以Windows下visual studio2022为例&#xff09;&#xff1a; 打开官网地址 Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com…

Playwright-python 自动化测试【Anaconda】环境配置

第一步&#xff1a;Anaconda的安装 安装Anaconda的好处&#xff0c;比prenv网速快&#xff0c;并且拥有独立的python环境&#xff0c;再也不用烦恼用哪个python好了。 Anaconda的下载页参见官网下载&#xff0c;Linux、Mac、Windows均支持。 https://mirrors.tuna.tsinghua.ed…

传奇人物《周兴和》书连载之68 创意改变了世界

2008年11月3日。 上海。 这一天对周兴和来说&#xff0c;是一个非常值得记忆的日子。 这一天&#xff0c;联合国“南南全球技术产权交易所” 揭牌仪式在上海举行。这个交易所是由联合国开发计划署、中国商务部和上海市三方共同组建设立的。其主要任务是帮助发展中国家&#…

.NET 发布和支持计划介绍

对于 .NET 的发布&#xff0c;大多数童鞋都知道现在每年发布一个版本&#xff0c;针对 .NET 的发布&#xff0c;最近有些更新&#xff0c;Current 版本将改为 STS 版本&#xff0c;所以写一篇文章介绍一下 每年 11 月都会发布新的 .NET 主要版本&#xff0c;使开发人员、社区和…

回归预测 | MATLAB实现MLR多元线性回归预测(多指标评价)

回归预测 | MATLAB实现MLR多元线性回归预测(多指标评价) 目录 回归预测 | MATLAB实现MLR多元线性回归预测(多指标评价)预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 回归预测 | MATLAB实现MLR多元线性回归预测(多指标评价) 模型描述 多元线性回归(Multip…

【Docker】命令大全

文章目录 基本命令镜像相关docker imagesdocker pulldocker rmidocker rundocker build镜像发布镜像常用命令 容器相关docker psdocker logs容器常用命令 数据卷相关网络相关compose相关swarm相关 基本命令 命令说明docker version显示版本信息docker info显示系统信息&#x…

SOFA Weekly|开源之夏 MOSN 与 Layotto 项目简介、社区会议预告、社区本周贡献

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展 欢迎留言互动&#xff5e; SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&am…

作为精益敏捷根基的科学管理与福特、大野耐一、戴明、德鲁克

果总这个文&#xff0c;对中外管理的基因做了解析&#xff1a; 数字化和管理哲学 &#xff5c; 中国企业为啥用不好ERP却信中台和阿米巴 《科学管理》是一本被低估的书&#xff0c;国内的管理很多还停留在“你有科学&#xff0c;我有神功”的阶段。重新学习科学管理很有必要。 …

linux实现CP指令

实现CP指令只需要五步 1.打开Src文件&#xff08;源文件&#xff09; 2.读Src到Buf 3.打开Des文件&#xff08;目标文件&#xff09; 4.写Buf到Des 5.关闭Src和Des文件 代码如下&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcn…

IntelliNode:Node.js大模型访问统一接口库【Gen AI】

使用最新的 AI 模型更新你的应用程序可能具有挑战性&#xff0c;因为它涉及了解不同 AI 模型的复杂性并管理许多依赖项。 IntelliNode 是一个开源库&#xff0c;旨在通过提供统一且易于使用的界面来解决集成 AI 模型的挑战。 这使开发人员能够快速构建 AI 原型并使用高级 AI 功…

QT QFormLayout表单布局控件

本文详细的介绍了QFormLayout控件的各种操作&#xff0c;例如&#xff1a;新建界面、控件布局、添加控件、添加标签、标签插入、删除控件行、显示格式、总行数、列间距、行间距、行列间距、其它文章等等操作。 实际开发中&#xff0c;一个界面上可能包含十几个控件&#xff0c;…