模式識別學習——遺傳演算法
阿新 • • 發佈:2019-02-10
%-------------------------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