线性判别分析的思想:
1.训练时:设法将训练样本投影到一条直线上,使得同类样本的投影点尽可能地接近、异类样本的投影点尽可能地远离。要学习的就是这样一条直线。(在二维中是一条直线,在三维中是一个平面,多维中,以此类推·)
2.预测时:将待预测样本投影到学到的直线上,根据他的投影点的位置来判断他的类别
考虑二分类问题,给定数据集T={(x1,y1),(x2,y2),…(xn,yn)}(x1,x2…xn为向量),xi属于R,yi属于{0,1},i =1,2,3…N
1.T0表示类别为0的样例集合,这些样例的均值向量为u0={u1,u2,u3...un},这些样例的特征之间的协方差矩阵为X0.(矩阵大小为n x n)
2.T0表示类别为0的样例集合,这些样例的均值向量为u1={u1,u2,u3...un},这些样例的特征之间的协方差矩阵为X1.(矩阵大小为n x n)
假定直线为y=wx(这里省略了常量b,因为考察的是样本点在直线上的投影,总可以平行移动直线到原点而保持投影不变,此时b=0),其中w=(w1,w2,w3…w4)
x=(x1,x2,x3…x4)
两类样本的中心在直线上的投影分别为w u0和w u1 (要求两者差值的绝对值尽可能的大才能满足异类样品中心点尽可能的远)
两类样品投影的方差分别为 w(T) X0 w 和w(T)X1 w(要求两者之和尽可能的小才能满足同类样品尽可能的接近)
通过数学公式将其化简为:w=S(-1)(u0-u1) (S为X0+X1,两个样本类的协方差矩阵和)
这是二类分类问题
将它推广到多分类中任务中:假定存在M个类,属于第i类的样本集合为Ti,Ti类中的样例个数为mi,设N为样本的总数。设Ti表示类别i,i=1,2,3…M的样例的集合,这些样例的均值向量为:
ui=(ui 1,ui 2,…ui n)
这些样例的特征之间的协方差矩阵为Xi(矩阵的大小为n x n)。定义u=(u1,u2,u3…u n)是所有案例的均值向量。
要使得同类样例的投影点尽可能的接近,则可以使同类样例投影点的方差尽可能的小。(X=X1+X2+X3…Xm)
要使异类样例的投影点尽可能地远,则可以使异类样例中心尽可能地远,由于这里又不止两个中心点,所以不能简单地套用二类分类的做法,这里用每一类样本集和中心点的总距的中心点的距离作为度量。考虑到每一个样本集的大小可能不同(密度分布不均),故我们对这个距离加以权重,因此定义间内散度矩阵Sb=(m1(u1-u)(u1-u)(T)x…m (u m-u)(u m-u)(T))
设W是投影矩阵,经过推导可得到最大化目标:
J=(W(T) Sb W) / W(T) X W
当J取最大时,
from sklearn import datasets, cross_validation,discriminant_analysis
###############################################################
#用莺尾花数据集
def load_data():
iris=datasets.load_iris()
return cross_validation.train_test_split(iris.data,iris.target,test_size=0.25,random_state=0,stratify=iris.target)
#返回为: 一个元组,依次为:训练样本集、测试样本集、训练样本的标记、测试样本的标记
##############################################################
def test_Linear(*data):
x_train,x_test,y_train,y_test=data
lda=discriminant_analysis.LinearDiscriminantAnalysis()
lda.fit(x_train,y_train)
print(‘Coefficients:%s, intercept %s’%(lda.coef_,lda.intercept_))#输出权重向量和b
print(‘Score: %.2f’ % lda.score(x_test, y_test))#测试集
print(‘Score: %.2f’ % lda.score(x_train, y_train))#训练集
#################################################################
x_train,x_test,y_train,y_test=load_data()
test_Linear(x_train,x_test,y_train,y_test)