1. 程式人生 > >模式識別學習——遺傳演算法

模式識別學習——遺傳演算法

%-------------------------scatter.m-----------------------------%
%類間離散度計算函式
%輸入引數是包含資料集的c和6位的編碼
function [y] = scatter(c,code)
d = c.data;
table = c.table;
j = 1;
for i = 1:6
    if code(i) == '1'
        set(j) = i;
        j = j + 1;
    end
end
if j == 1
        y = 0;
        return;
end
data = d(:,set);
num = zeros(size(data(1,:)));
for i = 1:numel(c.set1)%不能用size因為這裡是列向量,size必定得到兩個數1 73會出錯
    for j = 1:numel(c.set0)%numel(c.set1)得到的是陣列元素的個數
       num = num + dis(data(c.set1(i),:),data(c.set0(j),:)); 
    end
end
num = zeros(size(data(1,:)));
for i = 1:numel(c.set1)
    num = num + data(c.set1(i),:);
end
for i = 1:numel(c.set0)
    num = num + data(c.set0(i),:);
end
m_all = num / (numel(c.set1) + numel(c.set0));
%男生類的均值向量
num = zeros(size(data(1,:)));
for i = 1:numel(c.set1)
    num = num + data(c.set1(i),:);
end
m_boy = num / (numel(c.set1));
%女生類的均值向量
num = zeros(size(data(1,:)));
for i = 1:numel(c.set0)
    num = num + data(c.set0(i),:);
end
m_girl = num / (numel(c.set0));
%求出類間離差矩陣Sb
%Sb = (numel(c.set1) / (numel(c.set1) + numel(c.set0))*cha(m_boy,m_all) + numel(c.set0) / (numel(c.set1) + numel(c.set0))*cha(m_girl,m_all));
Sb = c.p1*cha(m_boy,m_all) + c.p0*cha(m_girl,m_all);
%y = Sb;
%下面求類內的離差矩陣Sw
num = cha(zeros(size(data(1,:))),zeros(size(data(1,:))));
for i = numel(c.set1)
    num = num + cha(data(c.set1(i),:),m_boy);
end
%男生的類內離差
Sw1 = 1 / (numel(c.set1))*num;
num = cha(zeros(size(data(1,:))),zeros(size(data(1,:))));
for i = numel(c.set0)
    num = num + cha(data(c.set0(i),:),m_girl);
end
%女生的類內離差
Sw0 = 1 / (numel(c.set0))*num;
%s1 = Sw1;s2 = Sw0;
%Sw = (numel(c.set1) / (numel(c.set1) + numel(c.set0)))*Sw1 + (numel(c.set0) / (numel(c.set1) + numel(c.set0)))*Sw0;
Sw = c.p1*Sw1 + c.p0*Sw0;
%下面是適應度函式J2 = ln[|Sb| / |Sw|]
%y = log(det(Sb) / det(Sw));
%y = log(abs(Sb) / abs(Sw));
y = (abs(Sb) / abs(Sw));
    function z = cha(x1,x2)
        m = (x1 - x2);
        z = m*m';
    end
    function z = dis(x1,x2)
        z = (x1 - x2).^2;
    end
end