神经网络/机器学习/svm/决策树/bp/主成分分析/降维/预测
%% SVM 两分类
clear
clc
%% 导入数据
data=xlsread('两类.xlsx');
x=data(:,1:4);
y=data(:,5);
%% Data_Number:数据数目 dim:自变量个数
[Data_Number,dim]=size(x);
%% 计算K的值
K=zeros(Data_Number,Data_Number);
for i=1:Data_Number
for j=1:Data_Number
K(i,j)=K_fun(x(i,:),x(j,:));
end
end
%% 迭代次数
iterations=100;
%% 惩罚因子
C=0.09;
%% 使用随机选择法更新alpha的值
%% 初始化alpha
alpha=zeros(Data_Number,1);
%% 随机选择进行迭代优化
for iter=1:iterations
% 记录原始个体
alpha_pre=alpha;
%
for j=1:Data_Number % 对 j 从1~Data_Number进行循环
% 随机选择一个个体i且(i~=j)
i=j; while i==j, i=randperm(Data_Number,1); end
% 选择的j和i个体
x_i=x(i,:); x_j=x(j,:); % 自变量
y_i=y(i); y_j=y(j); % 因变量
alpha_prime_i=alpha(i); alpha_prime_j=alpha(j); % alpha
% 计算 eta
eta=K(i,i)+K(j,j)-2*K(i,j);
% 如果eta==0,则此个体( j )不做更新
if eta==0, return; end
% 计算L和H
if y_j~=y_i
L=max([0,alpha_prime_j-alpha_prime_i]);
H=min([C,C+alpha_prime_j-alpha_prime_i]);
else
L=max([0,alpha_prime_j+alpha_prime_i-C]);
H=min([C,alpha_prime_j+alpha_prime_i]);
end
% 计算w: dim*1
w=x'*(alpha.*y);
% 计算b:计算每个个体对应的b,求平均值
b=mean(y-x*w);
% 预测
predict_i=sign(w'*x_i'+b);
predict_j=sign(w'*x_j'+b);
% 计算E
E_i=predict_i-y_i;
E_j=predict_j-y_j;
% 更新alpha(j)
alpha(j)=alpha_prime_j+y_j*(E_i-E_j)/eta;
if alpha(j)>H, alpha(j)=H; end
if alpha(j)<L, alpha(j)=L; end
% 更新alpha(i)
alpha(i)=alpha_prime_i+y_i*y_j*(alpha_prime_j-alpha(j));
end % 完成一次迭代
end % 停止迭代
%% 计算svm迭代之后的参数
w=x'*(alpha.*y);
b=mean(y-x*w);
%% 预测
y_predict=sign(((w')*(x'))'+b);
%% 计算正确率:
Right_ratio=sum(y==y_predict)/length(y_predict);
disp(['正确率:',num2str(Right_ratio)])
需要的daixie私聊我哟。有偿
%% SVM 两分类
clear
clc
%% 导入数据
data=xlsread('两类.xlsx');
x=data(:,1:4);
y=data(:,5);
%% Data_Number:数据数目 dim:自变量个数
[Data_Number,dim]=size(x);
%% 计算K的值
K=zeros(Data_Number,Data_Number);
for i=1:Data_Number
for j=1:Data_Number
K(i,j)=K_fun(x(i,:),x(j,:));
end
end
%% 迭代次数
iterations=100;
%% 惩罚因子
C=0.09;
%% 使用随机选择法更新alpha的值
%% 初始化alpha
alpha=zeros(Data_Number,1);
%% 随机选择进行迭代优化
for iter=1:iterations
% 记录原始个体
alpha_pre=alpha;
%
for j=1:Data_Number % 对 j 从1~Data_Number进行循环
% 随机选择一个个体i且(i~=j)
i=j; while i==j, i=randperm(Data_Number,1); end
% 选择的j和i个体
x_i=x(i,:); x_j=x(j,:); % 自变量
y_i=y(i); y_j=y(j); % 因变量
alpha_prime_i=alpha(i); alpha_prime_j=alpha(j); % alpha
% 计算 eta
eta=K(i,i)+K(j,j)-2*K(i,j);
% 如果eta==0,则此个体( j )不做更新
if eta==0, return; end
% 计算L和H
if y_j~=y_i
L=max([0,alpha_prime_j-alpha_prime_i]);
H=min([C,C+alpha_prime_j-alpha_prime_i]);
else
L=max([0,alpha_prime_j+alpha_prime_i-C]);
H=min([C,alpha_prime_j+alpha_prime_i]);
end
% 计算w: dim*1
w=x'*(alpha.*y);
% 计算b:计算每个个体对应的b,求平均值
b=mean(y-x*w);
% 预测
predict_i=sign(w'*x_i'+b);
predict_j=sign(w'*x_j'+b);
% 计算E
E_i=predict_i-y_i;
E_j=predict_j-y_j;
% 更新alpha(j)
alpha(j)=alpha_prime_j+y_j*(E_i-E_j)/eta;
if alpha(j)>H, alpha(j)=H; end
if alpha(j)<L, alpha(j)=L; end
% 更新alpha(i)
alpha(i)=alpha_prime_i+y_i*y_j*(alpha_prime_j-alpha(j));
end % 完成一次迭代
end % 停止迭代
%% 计算svm迭代之后的参数
w=x'*(alpha.*y);
b=mean(y-x*w);
%% 预测
y_predict=sign(((w')*(x'))'+b);
%% 计算正确率:
Right_ratio=sum(y==y_predict)/length(y_predict);
disp(['正确率:',num2str(Right_ratio)])
需要的daixie私聊我哟。有偿