├── main.m ├── 数据.xlsx ├── svmpredict.mexw64 ├── svmtrain.mexw64 ├── RouletteWheelSelection.m ├── svmtrain.mexw64_216351453.bak ├── svmpredict.mexw64_216351437.bak ├── svm_fitness.m ├── initialization.m ├── README.md ├── KPCA.m └── GWO.m /main.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lxy0068/GWO-Optimizing-SVM-Regression-Prediction-Based-on-KPCA-Kernel-Principal-Component-Analysis/HEAD/main.m -------------------------------------------------------------------------------- /数据.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lxy0068/GWO-Optimizing-SVM-Regression-Prediction-Based-on-KPCA-Kernel-Principal-Component-Analysis/HEAD/数据.xlsx -------------------------------------------------------------------------------- /svmpredict.mexw64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lxy0068/GWO-Optimizing-SVM-Regression-Prediction-Based-on-KPCA-Kernel-Principal-Component-Analysis/HEAD/svmpredict.mexw64 -------------------------------------------------------------------------------- /svmtrain.mexw64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lxy0068/GWO-Optimizing-SVM-Regression-Prediction-Based-on-KPCA-Kernel-Principal-Component-Analysis/HEAD/svmtrain.mexw64 -------------------------------------------------------------------------------- /RouletteWheelSelection.m: -------------------------------------------------------------------------------- 1 | function j=RouletteWheelSelection(P) 2 | r=rand; 3 | s=sum(P); 4 | P=P./s; 5 | C=cumsum(P); 6 | j=find(r<=C,1,'first'); 7 | end -------------------------------------------------------------------------------- /svmtrain.mexw64_216351453.bak: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lxy0068/GWO-Optimizing-SVM-Regression-Prediction-Based-on-KPCA-Kernel-Principal-Component-Analysis/HEAD/svmtrain.mexw64_216351453.bak -------------------------------------------------------------------------------- /svmpredict.mexw64_216351437.bak: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lxy0068/GWO-Optimizing-SVM-Regression-Prediction-Based-on-KPCA-Kernel-Principal-Component-Analysis/HEAD/svmpredict.mexw64_216351437.bak -------------------------------------------------------------------------------- /svm_fitness.m: -------------------------------------------------------------------------------- 1 | function score = svm_fitness(x, p_train, t_train, p_test, t_test) 2 | c = x(1); 3 | g = x(2); 4 | cmd = ['-t 2 -c ', num2str(c), ' -g ', num2str(g), ' -s 3 -p 0.01']; 5 | model = svmtrain(t_train, p_train, cmd); 6 | [~, accuracy, ~] = svmpredict(t_test, p_test, model); 7 | score = -accuracy(1); % 负数,因为SSA是最小化算法 8 | end 9 | -------------------------------------------------------------------------------- /initialization.m: -------------------------------------------------------------------------------- 1 | % 该函数初始化搜索代理的初始种群 2 | function Positions=initialization(SearchAgents_no,dim,ub,lb) 3 | 4 | Boundary_no= size(ub,1); % 边界数量 5 | 6 | % 如果所有变量的边界相等且用户输入单个值作为ub和lb 7 | if Boundary_no==1 8 | Positions=rand(SearchAgents_no,dim).*(ub-lb)+lb; 9 | end 10 | 11 | % 如果每个变量有不同的lb和ub 12 | if Boundary_no>1 13 | for i=1:dim 14 | ub_i=ub(i); 15 | lb_i=lb(i); 16 | Positions(:,i)=rand(SearchAgents_no,1).*(ub_i-lb_i)+lb_i; 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GWO-Optimizing-SVM-Regression-Prediction-Based-on-KPCA-Kernel-Principal-Component-Analysis 2 | 3 | Grey Wolf Algorithm Optimization Support Vector Machine Regression Prediction Based on KPCA Kernel Principal Component Analysis (Model Code for Mathematical Modeling Competition) 4 | 5 | ![image](https://github.com/user-attachments/assets/3dc36f18-d88b-4572-ad5e-f2e732618ba2) 6 | ![image](https://github.com/user-attachments/assets/ce5f9184-6ac8-4b99-9b7b-d381f96e66dc) 7 | ![image](https://github.com/user-attachments/assets/8685c2f2-02c3-474b-96ca-983e2c351203) 8 | ![image](https://github.com/user-attachments/assets/3c092bc6-0e07-4bb3-a088-bb22e938a5ab) 9 | ![image](https://github.com/user-attachments/assets/ebec5159-c0b7-4098-b056-75cb7129f40a) 10 | ![image](https://github.com/user-attachments/assets/173187f3-7700-412f-9b82-8c6b6bd6acc9) 11 | -------------------------------------------------------------------------------- /KPCA.m: -------------------------------------------------------------------------------- 1 | function Z=KPCA(X,N) 2 | data_get=X; 3 | data_get=data_get(:,1:end-1); 4 | [Xrow, Xcol] = size(data_get); % Xrow:样本个数 Xcol:样本属性个数 5 | %%数据预处理 6 | Xmean = mean(data_get); % 求原始数据的均值 7 | Xstd = std(data_get); % 求原始数据的方差 8 | X0 = (data_get-ones(Xrow,1)*Xmean) ./ (ones(Xrow,1)*Xstd); % 标准阵X0,标准化为均值0,方差1; 9 | c = 14000; %此参数可调 10 | %%求核矩阵 11 | for i = 1 : Xrow 12 | for j = 1 : Xrow 13 | %k(i,j)=kernel(data(i,:),data(j,:),2,6); 14 | K(i,j) = exp(-(norm(X0(i,:) - X0(j,:)))^2/c);%求核矩阵,采用径向基核函数,参数c 15 | end 16 | end 17 | %%中心化矩阵 18 | unit = (1/Xrow) * ones(Xrow, Xrow); 19 | Kp = K - unit*K - K*unit + unit*K*unit; % 中心化矩阵 20 | %%特征值分解 21 | [eigenvector, eigenvalue] = eig(Kp); % 求协方差矩阵的特征向量(eigenvector)和特征值(eigenvalue) 22 | %单位化特征向量 23 | for m =1 : Xrow 24 | for n =1 : Xrow 25 | Normvector(n,m) = eigenvector(n,m)/sum(eigenvector(:,m)); 26 | end 27 | end 28 | eigenvalue_vec = real(diag(eigenvalue)); %将特征值矩阵转换为向量 29 | [eigenvalue_sort, index] = sort(eigenvalue_vec, 'descend'); % 特征值按降序排列,eigenvalue_sort是排列后的数组,index是序号 30 | pcIndex = []; % 记录主元所在特征值向量中的序号 31 | pcn = N; 32 | for k = 1 : pcn % 特征值个数 33 | pcIndex(k) = index(k); % 保存主元序号 34 | end 35 | for i = 1 : pcn 36 | pc_vector(i) = eigenvalue_vec(pcIndex(i)); % 主元向量 37 | P(:, i) = Normvector(:, pcIndex(i)); % 主元所对应的特征向量(负荷向量) 38 | end 39 | Z=P; 40 | end -------------------------------------------------------------------------------- /GWO.m: -------------------------------------------------------------------------------- 1 | function [c,g]=GWO(SearchAgents_no,Max_iter,lb,ub,dim,inputn_train,outputn_train,inputn_test,outputn_test) 2 | fobj=@(x)svm_fitness(x,inputn_train,outputn_train,inputn_test,outputn_test); 3 | % 初始化alpha, beta和delta的位置 4 | Alpha_pos=zeros(1,dim); 5 | Alpha_score=inf; % 对于最大化问题,将此值改为-inf 6 | 7 | Beta_pos=zeros(1,dim); 8 | Beta_score=inf; % 对于最大化问题,将此值改为-inf 9 | 10 | Delta_pos=zeros(1,dim); 11 | Delta_score=inf; % 对于最大化问题,将此值改为-inf 12 | 13 | % 初始化搜索代理的位置 14 | Positions=initialization(SearchAgents_no,dim,ub,lb); 15 | 16 | Convergence_curve=zeros(1,Max_iter); 17 | 18 | l=0;% 循环计数器 19 | 20 | % 主循环 21 | while lub; 26 | Flag4lb=Positions(i,:)Alpha_score && fitnessAlpha_score && fitness>Beta_score && fitness