当前位置:   article > 正文

数学建模常用代码_数据建模代码

数据建模代码

SVM分类器

1.命令函数部分:

  1. clear;%清屏
  2. clc;
  3. X =load('data.txt');
  4. n = length(X);%总样本数量
  5. y = X(:,4);%类别标志
  6. X = X(:,1:3);
  7. TOL = 0.0001;%精度要求
  8. C = 1;%参数,对损失函数的权重
  9. b = 0;%初始设置截距b
  10. Wold = 0;%未更新a时的W(a)
  11. Wnew = 0;%更新a后的W(a)
  12. for i = 1 : 50%设置类别标志为1或者-1
  13.     y(i) = -1;
  14. end
  15. a = zeros(n,1);%参数a
  16. for i = 1 : n%随机初始化a,a属于[0,C]
  17.         a(i) = 0.2;
  18. end
  19. %为简化计算,减少重复计算进行的计算
  20. K = ones(n,n);
  21. for i = 1 :n%求出K矩阵,便于之后的计算
  22.     for j = 1 : n
  23.         K(i,j) = k(X(i,:),X(j,:));
  24.     end
  25. end
  26. sum = zeros(n,1);%中间变量,便于之后的计算,sum(k)=sigma a(i)*y(i)*K(k,i);
  27. for k = 1 : n
  28.     for i = 1 : n
  29.         sum(k) = sum(k) + a(i) * y(i) * K(i,k);
  30.     end
  31. end
  32. while 1%迭代过程
  33.     
  34. %启发式选点
  35. n1 = 1;%初始化,n1,n2代表选择的2个点
  36. n2 = 2;
  37. %n1按照第一个违反KKT条件的点选择
  38. while n1 <= n
  39.     if y(n1) * (sum(n1) + b) == 1 && a(n1) >= C && a(n1) <=  0
  40.          break;
  41.     end
  42.     if y(n1) * (sum(n1) + b) > 1 && a(n1) ~=  0
  43.            break;
  44.     end
  45.     if y(n1) * (sum(n1) + b) < 1 && a(n1) ~=C
  46.           break;
  47.     end
  48.      n1 = n1 + 1;              
  49. end
  50. %n2按照最大化|E1-E2|的原则选取
  51. E1 = 0;
  52. E2 = 0;
  53. maxDiff = 0;%假设的最大误差
  54. E1 = sum(n1) + b - y(n1);%n1的误差
  55. for i = 1 : n
  56.     tempSum = sum(i) + b - y(i);
  57.     if abs(E1 - tempSum)> maxDiff
  58.         maxDiff = abs(E1 - tempSum);
  59.         n2 = i;
  60.         E2 = tempSum;
  61.     end
  62. end
  63. %以下进行更新
  64. a1old = a(n1);
  65. a2old = a(n2);
  66. KK = K(n1,n1) + K(n2,n2) - 2*K(n1,n2);
  67. a2new = a2old + y(n2) *(E1 - E2) / KK;%计算新的a2
  68. %a2必须满足约束条件
  69. S = y(n1) * y(n2);
  70. if S == -1
  71.     U = max(0,a2old - a1old);
  72.     V = min(C,C - a1old + a2old);
  73. else
  74.     U = max(0,a1old + a2old - C);
  75.     V = min(C,a1old + a2old);
  76. end
  77. if a2new > V
  78.     a2new = V;
  79. end
  80. if a2new < U
  81.     a2new = U;
  82. end
  83. a1new = a1old + S * (a2old - a2new);%计算新的a1
  84. a(n1) = a1new;%更新a
  85. a(n2) = a2new;
  86. %更新部分值
  87. sum = zeros(n,1);
  88. for k = 1 : n
  89.     for i = 1 : n
  90.         sum(k) = sum(k) + a(i) * y(i) * K(i,k);
  91.     end
  92. end
  93. Wold = Wnew;
  94. Wnew = 0;%更新a后的W(a)
  95. tempSum = 0;%临时变量
  96. for i = 1 : n
  97.     for j = 1 : n
  98.     tempSum= tempSum + y(i )*y(j)*a(i)*a(j)*K(i,j);
  99.     end
  100.     Wnew= Wnew+ a(i);
  101. end
  102. Wnew= Wnew - 0.5 * tempSum;
  103. %以下更新b:通过找到某一个支持向量来计算
  104. support = 1;%支持向量坐标初始化
  105. while abs(a(support))< 1e-4 && support <= n
  106.     support = support + 1;
  107. end
  108. b = 1 / y(support) - sum(support);
  109. %判断停止条件
  110. if abs(Wnew/ Wold - 1 ) <= TOL
  111.     break;
  112. end
  113. end
  114. %输出结果:包括原分类,辨别函数计算结果,svm分类结果
  115. for i = 1 : n
  116.     fprintf('第%d点:原标号 ',i);
  117.     if i <= 50
  118.         fprintf('-1');
  119.     else
  120.         fprintf(' 1');
  121.     end
  122.     fprintf('    判别函数值%f      分类结果',sum(i) + b);
  123.     if abs(sum(i) + b - 1) < 0.5
  124.         fprintf('1\n');
  125.     else if abs(sum(i) + b + 1) < 0.5
  126.             fprintf('-1\n');
  127.         else
  128.             fprintf('归类错误\n');
  129.         end
  130.     end
  131. end

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

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

K-means算法代码

  1. function [Idx, Center] = K_means(X, xstart)
  2. % K-means聚类
  3. % Idx是数据点属于哪个类的标记,Center是每个类的中心位置
  4. % X是全部二维数据点,xstart是类的初始中心位置
  5. len = length(X); %X中的数据点个数
  6. Idx = zeros(len, 1); %每个数据点的Id,即属于哪个类
  7. C1 = xstart(1,:); %第1类的中心位置
  8. C2 = xstart(2,:); %第2类的中心位置
  9. C3 = xstart(3,:); %第3类的中心位置
  10. for i_for = 1:100
  11. %为避免循环运行时间过长,通常设置一个循环次数
  12. %或相邻两次聚类中心位置调整幅度小于某阈值则停止
  13. %更新数据点属于哪个类
  14. for i = 1:len
  15. x_temp = X(i,:); %提取出单个数据点
  16. d1 = norm(x_temp - C1); %与第1个类的距离
  17. d2 = norm(x_temp - C2); %与第2个类的距离
  18. d3 = norm(x_temp - C3); %与第3个类的距离
  19. d = [d1;d2;d3];
  20. [~, id] = min(d); %离哪个类最近则属于那个类
  21. Idx(i) = id;
  22. end
  23. %更新类的中心位置
  24. L1 = X(Idx == 1,:); %属于第1类的数据点
  25. L2 = X(Idx == 2,:); %属于第2类的数据点
  26. L3 = X(Idx == 3,:); %属于第3类的数据点
  27. C1 = mean(L1); %更新第1类的中心位置
  28. C2 = mean(L2); %更新第2类的中心位置
  29. C3 = mean(L3); %更新第3类的中心位置
  30. end
  31. Center = [C1; C2; C3]; %类的中心位置
  32. %演示数据
  33. %% 1 random sample
  34. %随机生成三组数据
  35. a = rand(30,2) * 2;
  36. b = rand(30,2) * 5;
  37. c = rand(30,2) * 10;
  38. figure(1);
  39. subplot(2,2,1);
  40. plot(a(:,1), a(:,2), 'r.'); hold on
  41. plot(b(:,1), b(:,2), 'g*');
  42. plot(c(:,1), c(:,2), 'bx'); hold off
  43. grid on;
  44. title('raw data');
  45. %% 2 K-means cluster
  46. X = [a; b; c]; %需要聚类的数据点
  47. xstart = [2 2; 5 5; 8 8]; %初始聚类中心
  48. subplot(2,2,2);
  49. plot(X(:,1), X(:,2), 'kx'); hold on
  50. plot(xstart(:,1), xstart(:,2), 'r*'); hold off
  51. grid on;
  52. title('raw data center');
  53. [Idx, Center] = K_means(X, xstart);
  54. subplot(2,2,4);
  55. plot(X(Idx==1,1), X(Idx==1,2), 'kx'); hold on
  56. plot(X(Idx==2,1), X(Idx==2,2), 'gx');
  57. plot(X(Idx==3,1), X(Idx==3,2), 'bx');
  58. plot(Center(:,1), Center(:,2), 'r*'); hold off
  59. grid on;
  60. title('K-means cluster result');
  61. disp('xstart = ');
  62. disp(xstart);
  63. disp('Center = ');
  64. disp(Center);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/887385
推荐阅读
相关标签
  

闽ICP备14008679号