Fisherova diskriminační funkce

lineární testovací statistika je lineární kombinace $t(X)=a^T X$, kde $X=[x_j]$ jsou data ($m$-rozměrná) se střední hodnotou $\mu$ ($m$-rozměrný vektor) a varianční maticí $V_{ij} = (X_i-\mu_i)^T (X_j-\mu_j)$.

Pak odhad separace 2 skupin dat $x_0$ a $x_1$, pro které máme projektované střední hodnoty $\tau_0=\bar{t(x_0)}$ a $\tau_1=\bar{t(x_1)}$ a podobně rozptyly $\Sigma=a^T V a$

$$J=\frac{(\tau_0-\tau_1)^2}{\Sigma_0+\Sigma_1}$$

$(\tau_0-\tau_1)^2=a^T B a$, kde $B_{ij}=(\mu_{0i}-\mu_{1i})(\mu_{0j}-\mu_{1j})$

maximalizace v $a$: $a \propto (\sum V_k)^{-1} (\mu_0-\mu_1)$ - stačí znát $\mu_k$, $V_{k}$, nemusíme parametrizovat celé rozdělení

Podle TAMU jde o maximalizaci poměru rozptylu mezi třídami a ve třídách samotných

$$J(a)=\frac{a^T B a}{a^T W a}$$

kde $W=V_0 + V_1$. Vektoru $W^{-1} (\mu_0-\mu_1)$ odpovídá hodnota $J=(\mu_0-\mu_1)^T W^{-1} (\mu_0-\mu_1)$.

Analýza více skupin vede k analogickému tvaru s $B_{ij}=\sum_k\ (\mu_{ki}-\nu_i)(\mu_{kj}-\nu_j)$, kde $\nu=\bar{x}$ je těžiště všech bodů. Hlednání maxima přes $a$ je pak zobecněný problém vlastních hodnot

$$(B - \lambda W)\ a=0$$ optimální $a$ je pak vektor odpovídající největšímu vlastnímu číslu (které odpovídá hodnotě $J(a)$)

In [31]:
x1,y1=10,4
x2,y2=5,8
def ellipse(cn,rd,ang=0,color='k',project=''):
    from math import pi
    x=rd[0]*cos(r_[:2*pi:20j])
    y=rd[1]*sin(r_[:2*pi:20j])
    x,y=cos(ang)*x-sin(ang)*y,cos(ang)*y+sin(ang)*x
    x+=cn[0]
    y+=cn[1]
    plot(x,y,color=color)
    if 'x' in project:
        plot(x,zeros(x.shape),color=color,lw=3)
    if 'y' in project:
        plot(zeros(y.shape),y,color=color,lw=3)
In [30]:
plot(x1,y1,'o',color='k')
plot(x2,y2,'o',color='k')
plot([0,x1],[y1,y1],'--',color='k')
plot([x1,x1],[0,y1],'--',color='k')
plot([0,x2],[y2,y2],'--',color='k')
plot([x2,x2],[0,y2],'--',color='k')
axhline(0,color='k')
axvline(0,color='k')
ellipse([x1,y1],[3,1],ang=20,color='red',project='xy')
ellipse([x2,y2],[3,1],ang=20,color='blue',project='xy')
xlim(-1,15)
ylim(-1,12)
xlabel(u'větší vzdálenost')
ylabel(u'lepší separovatelnost')
Out[30]:
<matplotlib.text.Text at 0x9d218ec>
In [37]:
angle=20*pi/180.
dx,dy=3,1

plot(x1,y1,'o',color='k')
plot(x2,y2,'o',color='k')
plot([0,-tan(angle)*12],[0,12],color='k')
sa,ca=sin(angle),cos(angle)
rdx=-sa*dy
rdy=ca*dy
plot([-sa*y1+rdx,x1+rdx],[ca*y1-sa*x1+rdy,y1+rdy],'--',color='k')
plot([-sa*y1-rdx,x1-rdx],[ca*y1-sa*x1-rdy,y1-rdy],'--',color='k')
#plot([x1,x1],[0,y1],'--',color='k')
plot([-sa*y2+rdx,x2+rdx],[ca*y2-sa*x2+rdy,y2+rdy],'--',color='k')
plot([-sa*y2-rdx,x2-rdx],[ca*y2-sa*x2-rdy,y2-rdy],'--',color='k')
#plot([x2,x2],[0,y2],'--',color='k')
axhline(0,color='k')
axvline(0,color='k')
ellipse([x1,y1],[dx,dy],ang=angle,color='red')
ellipse([x2,y2],[dx,dy],ang=angle,color='blue')

xlim(-6,15)
ylim(-1,12)
Out[37]:
(-1, 12)