首页 > 其他分享 >数学建模常用代码

数学建模常用代码

时间:2024-03-23 20:29:48浏览次数:13  
标签:end Idx 代码 建模 数学 sum n1 xstart n2

SVM分类器

1.命令函数部分:

clear;%清屏
clc;
X =load('data.txt');
n = length(X);%总样本数量
y = X(:,4);%类别标志
X = X(:,1:3);
TOL = 0.0001;%精度要求
C = 1;%参数,对损失函数的权重
b = 0;%初始设置截距b
Wold = 0;%未更新a时的W(a)
Wnew = 0;%更新a后的W(a)
for i = 1 : 50%设置类别标志为1或者-1
    y(i) = -1;
end
a = zeros(n,1);%参数a
for i = 1 : n%随机初始化a,a属于[0,C]
        a(i) = 0.2;
end

%为简化计算,减少重复计算进行的计算
K = ones(n,n);
for i = 1 :n%求出K矩阵,便于之后的计算
    for j = 1 : n
        K(i,j) = k(X(i,:),X(j,:));
    end
end
sum = zeros(n,1);%中间变量,便于之后的计算,sum(k)=sigma a(i)*y(i)*K(k,i);
for k = 1 : n
    for i = 1 : n
        sum(k) = sum(k) + a(i) * y(i) * K(i,k);
    end
end

while 1%迭代过程
    
%启发式选点
n1 = 1;%初始化,n1,n2代表选择的2个点
n2 = 2;
%n1按照第一个违反KKT条件的点选择
while n1 <= n
    if y(n1) * (sum(n1) + b) == 1 && a(n1) >= C && a(n1) <=  0
         break;
    end
    if y(n1) * (sum(n1) + b) > 1 && a(n1) ~=  0
           break;
    end
    if y(n1) * (sum(n1) + b) < 1 && a(n1) ~=C
          break;
    end
     n1 = n1 + 1;              
end
%n2按照最大化|E1-E2|的原则选取
E1 = 0;
E2 = 0;
maxDiff = 0;%假设的最大误差
E1 = sum(n1) + b - y(n1);%n1的误差
for i = 1 : n
    tempSum = sum(i) + b - y(i);
    if abs(E1 - tempSum)> maxDiff
        maxDiff = abs(E1 - tempSum);
        n2 = i;
        E2 = tempSum;
    end
end

%以下进行更新
a1old = a(n1);
a2old = a(n2);
KK = K(n1,n1) + K(n2,n2) - 2*K(n1,n2);
a2new = a2old + y(n2) *(E1 - E2) / KK;%计算新的a2
%a2必须满足约束条件
S = y(n1) * y(n2);
if S == -1
    U = max(0,a2old - a1old);
    V = min(C,C - a1old + a2old);
else
    U = max(0,a1old + a2old - C);
    V = min(C,a1old + a2old);
end
if a2new > V
    a2new = V;
end
if a2new < U
    a2new = U;
end
a1new = a1old + S * (a2old - a2new);%计算新的a1
a(n1) = a1new;%更新a
a(n2) = a2new;

%更新部分值
sum = zeros(n,1);
for k = 1 : n
    for i = 1 : n
        sum(k) = sum(k) + a(i) * y(i) * K(i,k);
    end
end
Wold = Wnew;
Wnew = 0;%更新a后的W(a)
tempSum = 0;%临时变量
for i = 1 : n
    for j = 1 : n
    tempSum= tempSum + y(i )*y(j)*a(i)*a(j)*K(i,j);
    end
    Wnew= Wnew+ a(i);
end
Wnew= Wnew - 0.5 * tempSum;
%以下更新b:通过找到某一个支持向量来计算
support = 1;%支持向量坐标初始化
while abs(a(support))< 1e-4 && support <= n
    support = support + 1;
end
b = 1 / y(support) - sum(support);
%判断停止条件
if abs(Wnew/ Wold - 1 ) <= TOL
    break;
end
end
%输出结果:包括原分类,辨别函数计算结果,svm分类结果
for i = 1 : n
    fprintf('第%d点:原标号 ',i);
    if i <= 50
        fprintf('-1');
    else
        fprintf(' 1');
    end
    fprintf('    判别函数值%f      分类结果',sum(i) + b);
    if abs(sum(i) + b - 1) < 0.5
        fprintf('1\n');
    else if abs(sum(i) + b + 1) < 0.5
            fprintf('-1\n');
        else
            fprintf('归类错误\n');
        end
    end
end

2.名为f的功能函数部分:
 

function y = k(x1,x2)
    y = exp(-0.5*norm(x1 - x2).^2);
end

K-means算法代码

function [Idx, Center] = K_means(X, xstart)
% K-means聚类
% Idx是数据点属于哪个类的标记,Center是每个类的中心位置
% X是全部二维数据点,xstart是类的初始中心位置

len = length(X);        %X中的数据点个数
Idx = zeros(len, 1);    %每个数据点的Id,即属于哪个类

C1 = xstart(1,:);       %第1类的中心位置
C2 = xstart(2,:);       %第2类的中心位置
C3 = xstart(3,:);       %第3类的中心位置

for i_for = 1:100
    %为避免循环运行时间过长,通常设置一个循环次数
    %或相邻两次聚类中心位置调整幅度小于某阈值则停止
    
    %更新数据点属于哪个类
    for i = 1:len
        x_temp = X(i,:);    %提取出单个数据点
        d1 = norm(x_temp - C1);    %与第1个类的距离
        d2 = norm(x_temp - C2);    %与第2个类的距离
        d3 = norm(x_temp - C3);    %与第3个类的距离
        d = [d1;d2;d3];
        [~, id] = min(d);   %离哪个类最近则属于那个类
        Idx(i) = id;
    end
    
    %更新类的中心位置
    L1 = X(Idx == 1,:);     %属于第1类的数据点
    L2 = X(Idx == 2,:);     %属于第2类的数据点
    L3 = X(Idx == 3,:);     %属于第3类的数据点
    C1 = mean(L1);      %更新第1类的中心位置
    C2 = mean(L2);      %更新第2类的中心位置
    C3 = mean(L3);      %更新第3类的中心位置
end

Center = [C1; C2; C3];  %类的中心位置


%演示数据
%% 1 random sample
%随机生成三组数据
a = rand(30,2) * 2;
b = rand(30,2) * 5;
c = rand(30,2) * 10;
figure(1);
subplot(2,2,1); 
plot(a(:,1), a(:,2), 'r.'); hold on
plot(b(:,1), b(:,2), 'g*');
plot(c(:,1), c(:,2), 'bx'); hold off
grid on;
title('raw data');

%% 2 K-means cluster
X = [a; b; c];  %需要聚类的数据点
xstart = [2 2; 5 5; 8 8];  %初始聚类中心
subplot(2,2,2);
plot(X(:,1), X(:,2), 'kx'); hold on
plot(xstart(:,1), xstart(:,2), 'r*'); hold off
grid on;
title('raw data center');

[Idx, Center] = K_means(X, xstart);
subplot(2,2,4);
plot(X(Idx==1,1), X(Idx==1,2), 'kx'); hold on
plot(X(Idx==2,1), X(Idx==2,2), 'gx');
plot(X(Idx==3,1), X(Idx==3,2), 'bx');
plot(Center(:,1), Center(:,2), 'r*'); hold off
grid on;
title('K-means cluster result');

disp('xstart = ');
disp(xstart);
disp('Center = ');
disp(Center);

标签:end,Idx,代码,建模,数学,sum,n1,xstart,n2
From: https://blog.csdn.net/m0_57692904/article/details/136974544

相关文章

  • 2002-2022年各地区出口技术复杂度数据(含原始数据+计算代码+结果)
    2002-2022年各地区出口技术复杂度数据(含原始数据+计算代码+结果)1、时间:2002-2022年2、来源:原始数据整理自国研网、海关总署、国家统计局3、范围:30省4、指标:进出口原始数据:时间、流向名称、商品编码、商品名称、伙伴编码、伙伴名称、主体编码、主体名称、方式编码、方式名......
  • 减肥代码
    减肥代码Wednesday14February2024热量的消耗并不是保持不变的,因此减少热量摄入并不能有效减肥。运动有很多好处,但它并不能减轻体重。肥胖症是由于体重设定点过高导致的。(身体存在稳态机制)。人类肥胖症是一种瘦素抵抗疾病。肥胖症的关键不在于热量平衡而在于热量平衡,治疗肥胖症......
  • 物理查询优化(二):两表连接算法(附具体案例及代码分析)
    前言关系代数的一项重要操作是连接运算,多个表连接是建立在两表之间连接的基础上的。研究两表连接的方式,对连接效率的提高有着直接的影响。连接方式是一个什么样的概念,或者说我们为何要有而且有好几种,对于不太了解数据库的人来讲可能这些是开头的疑惑。简单来讲,我们将数据存......
  • 03天【代码随想录算法训练营34期】第二章 链表part01(203.移除链表元素 、707.设计链表
    203.移除链表元素竟然可以做个假head,学到了classListNode(object):def__init__(self,val=0,next=None):self.val=valself.next=nextclassSolution(object):defremoveElements(self,head,val):dummy_head=ListNode(-1)......
  • 【CUMTOJ】法师康工人(代码细节控制)
    题目描述代码#include<bits/stdc++.h>usingnamespacestd;classworker{ public: intstart; intend; worker(){ } worker(inta,intb){ start=a;end=b; }};boolcmp(workerw1,workerw2){ returnw1.start<w2.start;}intmai......
  • AI金融预测领域综述文章筛选,附论文及代码链接,2021年版
    21年的综述最近读了3篇,总结笔记如下:(2021)SystematicLiteratureReview:StockPricePredictionUsingMachineLearningandDeepLearning评价:原文不值得看,精华是下面那4篇论文。但这篇综述的写法比较典型,都是先描述问题,搜解决策略(按关键字搜、按数据源搜比如某个领域的期刊),......
  • https多线程下载代码
    这里使用了curl网络库和使用多线程来下载对应https链接的文件对应的.h头文件:#pragmaonce#include<iostream>#include<fstream>#include<curl/curl.h>#include<pthread.h>#include<sys/mman.h>#include<sys/stat.h>#include<fcntl.h>#......
  • Collections工具类,可以使用collections工具类对代码中的list进行分组
    /***根据活动id进行分组*key活动id*value活动id对应的商品id*/Map<Long,Set<Long>>collect=activitySkuList.stream().collect(Collectors.groupingBy(ActivitySku::getActivityId......
  • 代码随想录算法训练营第五十五天| ● 583. 两个字符串的删除操作 ● 72. 编辑距离
    两个字符串的删除操作 题目链接:583.两个字符串的删除操作-力扣(LeetCode)思路:第一次尝试用画图法,然后肉眼观察dp递归规律……但是dp[i][j]的含义还是参考昨天的思路,表示到此处需要删除多少个字符。classSolution{public:intminDistance(stringword1,stringword2......
  • 利用 Lambda 获取更简洁的代码
    本文演示了一个Java重构的真实示例,旨在实现更简洁的代码和更好的关注点分离。这个想法源于我在专业环境中编码的经验。从前在生产代码中当我处理持久化一些域数据的代码时,我最终得到了以下结果:publicvoidprocessMessage(InsuranceProductproduct)throwsException......