多分类Fisher线性判别算法

Fisher线性判别法也即FLD实在PCA降维的基础上再进一步考虑样本间的信息。算法目标是找到一个投影轴,使各分类的类内样本在投影轴上的投影间距最小,同时样本间的投影间距最大。原理不难,公式推导遍地都是,尽管看不太懂吧..但是掌握核心几个公式以后就不妨碍我们用程序来实现它。

但是网上的例子多数是基于二分类的,那么对于多类别的样本如何使用FLD判别呢,这个问题没有太多的论述。所以想出了如下的办法去在多个分类的样本中应用FLD:对样本中的分类两两结合计算对应的w向量,测试数据进来后分别应用这些w向量对其进行FLD判断,判断成功的分类在最终结果中加一分,最后遍历了所有w后,得分最高的那个分类即是测试数据的分类结果。办法虽然笨,但是基本还算能完成功能吧..

import os  
import sys  
import numpy as np  
from numpy import *  
import operator  
import matplotlib  
import matplotlib.pyplot as plt

def class_mean(samples):#求样本均值
    aver = np.mean(samples,axis = 1)
    return aver

def withclass_scatter(samples,mean):#求类内散度
    dim,num = samples.shape()
    samples_m = samples - mean
    s_with = 0
    for i in range(num):
        x = samples_mean[:,i]
        s_in += dot(x,x.T)
    return s_in

def get_w(s_in1,s_in2,mean1,mean2):#得到权向量
    sw = s_in1 + s_in2
    w = dot(sw.I,(mean1-mean2))
    return w

def classify(test,w,mean1,mean2):#分类算法
    cen_1 = dot(w.T,mean1)
    cen_2 = dot(w.T,mean2)
    g = dot(w.T,sample)
    return abs(pos - cen_1)


你可能感兴趣的:(学习笔记)