私はこのウェブサイトが初めてで、Matlab と Support-Vector-Machines に関しては初めてで、先生がこのコードを教えてくれました。
clear all;
clc;
X_plus = load('example2_SVM.m');
[m,n] = size(X_plus);
ligne = m;
ligne_plus = 0;
for i=1:ligne
if(X_plus(i,n)==1)
ligne_plus = ligne_plus +1;
end
end
ligne_moins = ligne-ligne_plus;
colonne = n-1;
for i=1:ligne
y(1,i) = X_plus(i,colonne+1);
end
for i=1:ligne
for j=1:ligne
s=0;
for k=1:colonne
s = s + X_plus(i,k)*X_plus(j,k);
end
H(i,j) = y(i)*y(j)*s;
end
end
f = ones(1,ligne);
A = [];
b = [];
beq = zeros(1,1);
lb = zeros(1,ligne);
ub = zeros(1,ligne);
bornes_sup = 0.5;
for i=1:ligne
ub(i) = bornes_sup;
end
Aeq = y;
f = -f;
alpha = quadprog(H,f,A,b,Aeq,beq,lb,ub);
for k=1:colonne
s=0;
for i=1:ligne
s = s + alpha(i)*y(i)*X_plus(i,k);
end
w(k) = s;
end
for i=1:ligne
if(alpha(i)>0.001)
support = i;
break;
end
end
s = 0;
for k=1:colonne
for i=1:ligne
s = s + alpha(i)*y(i)*X_plus(support,k)*X_plus(i,k);
end
end
w0 = y(support) - s;
for i=1:m
if(X_plus(i,3)==1)
plot(X_plus(i,1),X_plus(i,2),'--rs','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g','MarkerSize',5)
else
plot(X_plus(i,1),X_plus(i,2),'--rs','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','r','MarkerSize',5)
end
hold on
end
hold on
x = -10:0.1:10;
y = -10:0.1:10;
if(w(2) ~= 0)
plot(x,-w(1)/w(2)*x-w0/w(2),'--rs','LineWidth',0.2,'MarkerEdgeColor','k','MarkerFaceColor','g','MarkerSize',1)
else
plot(x,-w0/w(1),'--rs','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g','MarkerSize',1)
end
これは example2_SVM.m です:
1 0 +1
2 0 +1
1 1 +1
0 1 +1
0 2 +1
4 -1 +1
3 0 +1
3 3 -1
4 3 -1
5 3 -1
5 4 -1
5 2 -1
6 4 -1
4 2 -1
4 5 -1
このコードで何をしているのか:正と負の値を含むexample2_SVM.mからデータを読み取っています。
http://i.stack.imgur.com/Jkpsm.jpg
ポイントが線形に分離可能であることがわかるように、私の質問は、このコードを変更して、このデータを使用して多項式除算器を描画する方法です。
1 2 +1
3 1 +1
3 2.5 +1
1 1 -1
2 3 -1
2 1 -1