简单线性分类学习机(平分最近点法)matlab实现
听语音
- |
- 浏览:19
- |
- 更新:2016-10-07 23:20
方法/步骤
-
采用直线的垂直平分线:
首先求任意两点的之间的距离,构成距离矩阵,并求出最近距离,返回下标,求斜率,及两点之间的中点。并绘制垂直平分线。
-
代码:
datax=[1 2;1.5 2;0.5 1;2 1.5;2.5 2];
datay=[3 4;3.5 4;3.5 5;5 4.5;5.5 5];
distance_matrix=zeros(length(datax),length(datay));
for i=1:length(datax)
for j=1:length(datay)
distance_matrix(i,j)=sqrt((datax(i,1)-datay(j,1))^2+(datax(i,2)-datay(j,2))^2);
end
end
[c,i]=min(distance_matrix);
[k,j]=min(c);
data=[datax(i(1),:);datay(j,:)];
x=0:0.01:5;
y=-1.0/((data(2,2)-data(1,2))/(data(2,1)-data(1,1)))*(x-(data(1,1)+data(2,1))/2)+(data(1,2)+data(2,2))/2;
plot(datax(:,1),datax(:,2),'r+');hold on
plot(datay(:,1),datay(:,2),'go');hold on
plot(x,y,'b-')
xlim([0,6]);
ylim([0,6]);
plot(4,3.5,'r*')
*点用于表示检测的数据点
-
求 距离矩阵,返回 最小值下标,求垂直平分线方程。k1*k2=-1,并求出中点,斜率和在直线上的点坐标,构造方程,绘制曲线。scatter绘制散点图,
-
接下来介绍正式的算法:平分最近点法,
通过非线性优化函数fmincon,求出向量α,使用α求出函数参数ω和b
决策函数为:sign(ω*x+b)
-
代码如下:
datax1=[1 2;1.5 2;0.5 1;2 1.5;2.5 2];
datax2=[3 4;3.5 4;3.5 5;5 4.5;5.5 5];
syms a1 a2 a3 a4 a5;
a=[a1 a2 a3 a4 a5];
[n m]=size(datax1);
f=zeros(length(a));
for i=1:n
for j=1:m
f(i)=f(i)+datax1(i,j)-datax2(i,j);
end
end
tol=zeros(length(a),length(a));
for i=1:length(f)
for j=1:length(f)
tol(i,j)=f(i)*f(j);
end
end
tol=tol/2;
.M file:
function f=myfun_2(x)
f=8*x(1)^2 + 16*x(1)*x(2) + 28*x(1)*x(3) + 24*x(1)*x(4) + 24*x(1)*x(5) + 8*x(2)^2 + 28*x(2)*x(3) + 24*x(2)*x(4) + 24*x(2)*x(5) + (49*x(3)^2)/2 + 42*x(3)*x(4) + 42*x(3)*x(5) + 18*x(4)^2 + 36*x(4)*x(5) + 18*x(5)^2;
[x,fval]=fmincon(@myfun_2,[0.2;0.2;0.2;0.2;0.2],[-1 0 0 0 0;0 -1 0 0 0;0 0 -1 0 0;0 0 0 -1 0;0 0 0 0 -1],[0;0;0;0;0],[1 1 1 1 1],[1])
c=0;d=0;
for i=1:length(x)
c=c+datax1(i,1)*x(i)+datax1(i,2)*x(i);
end
for i=1:length(x)
d=d+datax2(i,1)*x(i)+datax2(i,2)*x(i);
end
w=c-d;
b=-1/2*((c-d)*(c+d));
-
关于fmincon这是一个非线性优化函数,也是常用的优化函数之一。
A*x<=b
Aeq*x=beq
lb<=x<=ub
-