引: 判别分析是针对分布问题的方法,从机器学习角度来说是有监督学习方法 例如:在医学诊断中,一个病人肺部有阴影,医生要判断他患的是肺结核、肺部肿瘤还是肺癌?这里由肺结核病人、良性肿瘤病人、肺癌病人构成三个总体,病人来源于这三个总体之一,判别分析的目的是通过测得病人的指标(阴影的大小、边缘是否光滑、体温...)来判断他应该是属于哪个总体
距离判别
距离判别的思想是:样品和哪个总体距离最近,就判断它是属于哪个总体
假如有两个类别(G1和G2)的不同数据,总体G1的分布为 N ( μ 1 , σ 1 2 ) N(\mu_1,\sigma_1^2) N(μ1,σ12),总体G1的分布为 N ( μ 2 , σ 1 2 ) N(\mu_2,\sigma_1^2) N(μ2,σ12)
定义X0与G1和G2的相对距离为(以下定义与总体分布无关)
d
1
2
(
x
0
)
=
(
x
0
−
μ
1
)
2
σ
1
2
d_1^2(x0)=\frac{(x0-\mu_1)^2}{\sigma_1^2}
d12(x0)=σ12(x0−μ1)2
d
2
2
(
x
0
)
=
(
x
0
−
μ
2
)
2
σ
2
2
d_2^2(x0)=\frac{(x0-\mu_2)^2}{\sigma_2^2}
d22(x0)=σ22(x0−μ2)2
于是我们可以找到分界点
μ
∗
\mu^*
μ∗和
μ
∗
\mu_*
μ∗
使得
(
x
0
−
μ
1
)
2
σ
1
2
\frac{(x0-\mu_1)^2}{\sigma_1^2}
σ12(x0−μ1)2=
(
x
0
−
μ
2
)
2
σ
2
2
\frac{(x0-\mu_2)^2}{\sigma_2^2}
σ22(x0−μ2)2
⇒
\Rightarrow
⇒x
=
μ
1
σ
2
+
μ
2
σ
1
σ
1
+
σ
2
=
μ
∗
=\frac{\mu_1\sigma_2+\mu_2\sigma_1}{\sigma_1+\sigma_2}=\mu^*
=σ1+σ2μ1σ2+μ2σ1=μ∗
和x
=
μ
1
σ
2
−
μ
2
σ
1
σ
2
−
σ
1
=
μ
∗
=\frac{\mu_1\sigma_2-\mu_2\sigma_1}{\sigma_2-\sigma_1}=\mu_*
=σ2−σ1μ1σ2−μ2σ1=μ∗
为什么有两个解?
如上图所示,若两总体方差不等,则在两总体均值
μ
1
\mu_1
μ1和
μ
2
\mu_2
μ2之间,有一解
μ
∗
\mu^*
μ∗,在方差较小的总体右边有一解
μ
∗
\mu_*
μ∗
若两总体方差相等,则只有一解在两总体均值之间
因此判别准则为:
当
μ
∗
\mu^*
μ∗<x<
μ
∗
\mu_*
μ∗,x
∈
G
1
\in G1
∈G1
当X<
μ
∗
\mu^*
μ∗或x>
μ
∗
\mu_*
μ∗,x
∈
G
2
\in G2
∈G2
在多元情况下,我们定义距离为
于是,在多元情况下我们用样本均值和样本离差阵代替期望和协方差矩阵(若未知)
两个总体情况下,如果
Σ
1
=
Σ
2
\Sigma_1=\Sigma_2
Σ1=Σ2
则我们可推得判别准则为一个线性判别函数(超平面)
当协方差矩阵不等时,距离之差为一个二次函数(二次型),如一元情况,在这个二次函数围成的闭区间内为一个类,在闭区间外为另一类
若总体个数大于2,我们应该计算x在每个总体的马氏距离,并且把x判归距离最小的那个总体
Bayes判别
上面的距离判别可以说是Bayes判别的特殊情况,Bayes判别还要考虑属于各个总体的先验概率,并且可以计算错判造成的损失
正态假设
以下推导建立在总体的正态假设下
两个总体时(推导如下):
可见,在协方差矩阵相等的情况下,除线性判别函数常数项增加了考虑先验概率的部分外,与马氏距离判别法是一样的
误判的概率为
logistic判别
Fisher判别
应用于LDA的降维方法,像主成分分析一样提取数据的主要特征再进行判别
上面有fisher判别构建的线性函数成为线性判别函数linear discriminant function(不知道为啥)
Δ a \Delta a Δa称为判别效率,等于最大特征值
依次类推,若仅用一个线性判别函数不能很好区分k个总体(画图或用判别效率),我们可以用第二大特征值 λ 2 \lambda_2 λ2,它所对应的满足 l 2 ′ A l 2 = 1 l_2'Al_2=1 l2′Al2=1的特征向量 l 2 l_2 l2,建立第二个线性判别函数 l 2 ′ X l_2'X l2′X,不行就建立第三个判别函数
*
为什么特征向量数量r
≤
\leq
≤k-1?
因为要对k个总体分类,最多只需要k-1个判别函数
R Program
library(MASS)
wine=read.table("C:/Users/18461/Desktop/wine.train.txt")
wine.lda = lda(wine$V14 ~ ., wine)#R语言调用函数lda是MASS包中
type=wine$V14#数据第14列是种类,前13列是自变量
LD = predict(wine.lda)
wine.lda
lda调用函数解释
Call:
lda(wine$V14 ~ ., data = wine)
Prior probabilities of groups: ##这是计算先验概率
1 2 3
0.3220339 0.3898305 0.2881356
Group means: #计算每组各自变量均值
V1 V2 V3 V4 V5
1 13.73763 1.933684 2.493684 17.00526 108.50000
2 12.27739 1.976957 2.281739 20.69565 94.73913
3 13.15059 3.458235 2.448235 21.44118 98.17647
V6 V7 V8 V9
1 2.845263 2.9697368 0.3050000 1.864474
2 2.250435 2.1556522 0.3641304 1.721522
3 1.725882 0.7864706 0.4561765 1.137059
V10 V11 V12 V13
1 5.554474 1.0831579 3.101579 1114.2105
2 3.163043 1.0730435 2.838696 523.9348
3 7.417059 0.6985294 1.687941 620.2941
Coefficients of linear discriminants: (由于这里k=3,因此线性判别函数有2个)
LD1 LD2
V1 -0.511244928 0.969702370
V2 0.258344142 0.292124971
V3 -1.025022033 2.660728316
V4 0.137671902 -0.216784939
V5 0.005982794 0.001589583
V6 0.825384675 0.204914606
V7 -1.497234903 -0.527624083
V8 -0.782651707 -0.741267095
V9 -0.132131408 -0.563902276
V10 0.332815833 0.167774503
V11 -1.230827739 -1.361751242
V12 -1.264082609 -0.098889671
V13 -0.002683669 0.002759903
Proportion of trace: (计算特征值占比,可见第一线性判别函数判别能力高)
LD1 LD2
0.6837 0.3163
计算线性判别函数
调用predict中的x
绘制线性判别函数的二维图
plot(
LD$x[,1],LD$x[,2],
col = type,
xlab = "1st Linear Discriminant Score",
ylab = "2nd Linear Discriminant Score"
)
通过plot可以发现,LD1 和 LD2 一起能比较好的将 3 种酒分开。而沿着LD1方向三种酒容易区分,而沿着LD2方向绿色和黑色在相近位置。这说明LD1是判别效率最高的函数,在LD2中也存在有助于判别的信息。