千葉大学フロンティア医工学センター
羽石 秀昭 様 「判別分析2」.
のテキストで学習した記録です。
線形判別分析は、以下の前提条件が成立する必要があります。
Rで判別分析いろいろ(11種類)
では色々な判別方法が述べられていますが、
ここでは「線形判別分析(LDA)」「ベイズ判別」について紹介します。
HELLO
CYBERNETICS
様 「フィッシャーの線形判別」(二次形式表現)によれば、
フィッシャーの線形判別は、データを分類するための都合の良い線形変換を見つける手法です。手順としては、
事前確率が等しい前提では、クラス重心の中点の射影が分離点になります。
事前確率を考慮する場合は、ベイス判別の方法を用いることになります。
[手順1] 判別直線は、
\(w={S_W}^{-1}(m_1-m_2)\)
を法線ベクトルとし、各クラスの平均の中点を通る直線です。
2つの群の判別の場合、
(マハラノビスから求めた判別方向は、群間変動から求めたものと一致している)
[手順2]
次に、分離の境界点をどこにするかが問題となります。
・事前確率が同じである場合であれば、2つの正規分布関数の交点が分離の境界点となります。
(判別直線が2群の重心の中点を通る場合で、このとき誤判別確率は最小となる)
誤判別確率.
\(P_e=T(R_A,R_B)=\pi_A\int_{R_B}f_A(x)dx+\pi_B\int_{R_A}f_B(x)dx\).
人文2022②では、
\(\displaystyle
\int_{R_B}f_A(x)dx=P(Y<0\mid G_A )\):判別関数 Y
によって計算している。
・事前確率が異なる場合であれば、比率によって判別の境界が移動する。(羽石サイト2のp11).
ベイズ判別の方法で事後確率を比較すると、
境界線は、 羽石サイト2のp14(2群の分散共分散行列が共通のとき)
筆者は、
事前確率を考慮するのならば、はじめからベイズ判別を使うべきと思う。
人文2015④(3)(4)は、2変量正規分布に対するベイズ予測ルールで、
事前確率が等しいので重心の中点を通る判別直線になる。
ベイズ予測ルールは事前確率が異なる場合も対応可能である。
(問題はそこまで問うてはいないが)
詳しくは当サイト「判別分析_まとめ」を参照.
確率的距離が等しくなる条件を2次形式を用いて計算することになり、境界を直接算出できます。方向と分離点が同時に算出されていることになりますが、事前確率を考慮した判別はできません。
人文2022②(2)では、
マハラノビスの距離を用いて判別直線を導出しています。
ベイズによる事後確率が最大となる群に判別する方法で、大森先生のテキストによれば、最適な判別規則ということになります。
人文2015④(3)(4)が該当する問題です。
射影済みクラスの判別と考えることができます。線形判別式の係数は1になります。
library(MASS)
x<-c(1:3);y<-c(3:5)
d<-data.frame(x,y);d
x | y |
---|---|
1 | 3 |
2 | 4 |
3 | 5 |
library(reshape)
dat <- melt(d, variable_name = "group");dat
## Using as id variables
group | value |
---|---|
x | 1 |
x | 2 |
x | 3 |
y | 3 |
y | 4 |
y | 5 |
boxplot(value ~ group,data=dat)
(Z<- lda(group~ value,data=dat))
## Call:
## lda(group ~ value, data = dat)
##
## Prior probabilities of groups:
## x y
## 0.5 0.5
##
## Group means:
## value
## x 2
## y 4
##
## Coefficients of linear discriminants:
## LD1
## value 1
predict(Z)$class#判別の予測値
## [1] x x x x y y
## Levels: x y
round(predict(Z)$posterior,2)#判別の事後確率
## x y
## 1 0.98 0.02
## 2 0.88 0.12
## 3 0.50 0.50
## 4 0.50 0.50
## 5 0.12 0.88
## 6 0.02 0.98
predict(Z)$x#判別関数の値
## LD1
## 1 -2
## 2 -1
## 3 0
## 4 0
## 5 1
## 6 2
#plot(Z,dimen=1)
判別関数は平均を通ることから、 \(f(z)=z-3\).
サンプル数を100ずつとする。
library(MASS)
mA <- c(30,50)
mB <- c(40,50)
Sigma <- matrix(c(20,14,14,20), 2, 2)
Sigma
## [,1] [,2]
## [1,] 20 14
## [2,] 14 20
dataA <- mvrnorm(100, mA, Sigma)
dataB <- mvrnorm(100, mB, Sigma)
dA <- data.frame(X=dataA[,1],Y=dataA[,2],Z=rep("A",100))
dB <- data.frame(X=dataB[,1],Y=dataB[,2],Z=rep("B",100))
plot(dA[,1:2],xlim=c(20,50),ylim=c(35,65))
par(new=T)
plot(dB[,1:2],xlim=c(20,50),ylim=c(35,65),col="red")
d <- rbind(dA,dB)
#クラス重心の中点
m1 <- c(mean(dA[,1]),mean(dA[,2]))
m2 <- c(mean(dB[,1]),mean(dB[,2]))
m <- (m1+m2)/2;m
## [1] 35.18948 50.22268
判別関数の手計算.
#判別関数の手計算
d[1:6,1:2]
X | Y |
---|---|
31.71100 | 51.90537 |
39.95168 | 61.00549 |
38.00671 | 57.83068 |
29.93839 | 53.62471 |
29.50599 | 47.61580 |
25.51773 | 50.61455 |
#群内分散
var(d[1:100,1:2])
## X Y
## X 22.74451 15.81835
## Y 15.81835 19.26158
var(d[101:200,1:2])
## X Y
## X 18.71895 14.33704
## Y 14.33704 22.93239
#プールした群内分散
pSigma <- (var(d[1:100,1:2])+var(d[101:200,1:2]))*99/198
p1 <- mahalanobis(d[,1:2],m1,pSigma)
P1 <-exp((-1/2)*p1)/ (2*pi*sqrt(det(pSigma)));#P1
p2 <- mahalanobis(d[,1:2],m2,pSigma)
P2 <- exp((-1/2)*p2)/(2*pi*sqrt(det(pSigma)));#P2
P <- log(P1)-log(P2)
P <- log(P1/P2)-mean(log(P1/P2))
mean(P)
## [1] 4.440892e-17
mean(log(P1/P2))
## [1] 1.083578e-15
var(P[1:100])
## [1] 9.737009
var(P[101:200])
## [1] 9.620394
#判別関数の群内分散が1になるようにするとIDRの結果と一致する
varp <- (var(P[1:100])+var(P[101:200]))*99/198
varp
## [1] 9.678701
par(mfrow=c(3,1))
hist(P[1:100]/sqrt(varp),xlim=c(-15,15))
hist(P[101:200]/sqrt(varp),xlim=c(-15,15))
hist(P[1:200]/sqrt(varp),xlim=c(-15,15))
var(P/sqrt(varp))
## [1] 3.426809
head(P/sqrt(varp))
## [1] 1.4777231 0.8966895 0.8046911 2.4230519 1.2194094 3.1523059
判別関数の群内分散が1になるようにするとIDRの結果と一致する.
LDAによる計算.
(Z<- lda(Z~ .,data=d))
## Call:
## lda(Z ~ ., data = d)
##
## Prior probabilities of groups:
## A B
## 0.5 0.5
##
## Group means:
## X Y
## A 30.20301 50.11230
## B 40.17595 50.33306
##
## Coefficients of linear discriminants:
## LD1
## X 0.3168891
## Y -0.2231124
# ldaから求めた法線ベクトル
k <- Z $ scaling;k
## LD1
## X 0.3168891
## Y -0.2231124
b <- m[1]*k[1]/k[2]+m[2];b
## [1] 0.2426448
a <- (-1)*k[1]/k[2];a
## [1] 1.420312
plot(Z,dimen=1)
abline(b,a)
n <- solve(Sigma)%*%(m2-m1)#法線ベクトル
(-n[1]/n[2])
## [1] 1.452363
ldaから求めた傾きとほぼ一致している。
Z
## Call:
## lda(Z ~ ., data = d)
##
## Prior probabilities of groups:
## A B
## 0.5 0.5
##
## Group means:
## X Y
## A 30.20301 50.11230
## B 40.17595 50.33306
##
## Coefficients of linear discriminants:
## LD1
## X 0.3168891
## Y -0.2231124
head(predict(Z)$class)#判別の予測値
## [1] A A A A A A
## Levels: A B
head(round(predict(Z)$posterior,2))#判別の事後確率
## A B
## 1 0.99 0.01
## 2 0.94 0.06
## 3 0.92 0.08
## 4 1.00 0.00
## 5 0.98 0.02
## 6 1.00 0.00
#判別関数の値
head(predict(Z)$x)
## LD1
## 1 -1.4777231
## 2 -0.8966895
## 3 -0.8046911
## 4 -2.4230519
## 5 -1.2194094
## 6 -3.1523059
var(predict(Z)$x)
## LD1
## LD1 3.426809
library("dplyr")
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:reshape':
##
## rename
## The following object is masked from 'package:MASS':
##
## select
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
predict <- as.data.frame(predict(Z)$x)
head(predict)
LD1 |
---|
-1.4777231 |
-0.8966895 |
-0.8046911 |
-2.4230519 |
-1.2194094 |
-3.1523059 |
dat <- mutate(predict,Z=c(rep(-1,100),rep(1,100)))
head(dat)
LD1 | Z |
---|---|
-1.4777231 | -1 |
-0.8966895 | -1 |
-0.8046911 | -1 |
-2.4230519 | -1 |
-1.2194094 | -1 |
-3.1523059 | -1 |
Z<- lda(Z~ .,data=dat)
plot(Z,dimen=2)
abline(0,1)
var(predict[1:100,])
## [1] 1.006024
var(predict[101:200,])
## [1] 0.9939757
#プール分散
(var(predict[1:100,])*99+var(predict[101:200,])*99)/200
## [1] 0.99
mA <- mean(predict[1:100,]);mA
## [1] -1.555531
mB <- mean(predict[101:200,]);mB
## [1] 1.555531
predict[1:6,]
## [1] -1.4777231 -0.8966895 -0.8046911 -2.4230519 -1.2194094 -3.1523059
P1 <- dnorm(predict[1:6,],mA,1);P1
## [1] 0.3977365 0.3211091 0.3009478 0.2738335 0.3770312 0.1114940
P2 <- dnorm(predict[1:6,],mB,1);P2
## [1] 4.008843e-03 1.972970e-02 2.461839e-02 1.457675e-04 8.488147e-03
## [6] 6.139295e-06
#事後確率
P1/(P1+P2)
## [1] 0.9900214 0.9421143 0.9243829 0.9994680 0.9779826 0.9999449
A:B=1000:100 とする。
library(MASS)
mA <- c(30,50)
mB <- c(40,50)
Sigma <- matrix(c(20,14,14,20), 2, 2)
Sigma
## [,1] [,2]
## [1,] 20 14
## [2,] 14 20
dataA <- mvrnorm(1000, mA, Sigma)
dataB <- mvrnorm(100, mB, Sigma)
dA <- data.frame(X=dataA[,1],Y=dataA[,2],Z=rep("A",1000))
dB <- data.frame(X=dataB[,1],Y=dataB[,2],Z=rep("B",100))
plot(dA[,1:2],xlim=c(20,50),ylim=c(35,65))
par(new=T)
plot(dB[,1:2],xlim=c(20,50),ylim=c(35,65),col="red")
d <- rbind(dA,dB)
m1 <- c(mean(dA[,1]),mean(dA[,2]))
m2 <- c(mean(dB[,1]),mean(dB[,2]))
m <- (m1+m2)/2;m
## [1] 34.94349 50.15914
(Z<- lda(Z~ .,data=d))
## Call:
## lda(Z ~ ., data = d)
##
## Prior probabilities of groups:
## A B
## 0.90909091 0.09090909
##
## Group means:
## X Y
## A 29.86527 49.86680
## B 40.02171 50.45149
##
## Coefficients of linear discriminants:
## LD1
## X 0.3104140
## Y -0.2012189
k <- Z $ scaling;k
## LD1
## X 0.3104140
## Y -0.2012189
b <- m[1]*k[1]/k[2]+m[2];b
## [1] -3.747055
a <- (-1)*k[1]/k[2];a
## [1] 1.542668
abline(b,a)
n <- solve(Sigma)%*%(m2-m1)#法線ベクトル
(-n[1]/n[2])
## [1] 1.493858
LDR(線形判別)ではサンプル数の影響を受けていないようである。 分離点は各クラスの重心の中点であり、サンプル数が増えても変わらないからである。
判別関数の手計算.
var(d[1:1000,1:2])
## X Y
## X 19.61238 13.55002
## Y 13.55002 19.71111
var(d[1001:1100,1:2])
## X Y
## X 17.99292 11.88159
## Y 11.88159 19.74013
#プールした群内分散
pSigma <- (var(d[1:1000,1:2])*999+var(d[101:200,1:2])*99)/1098
p1 <- mahalanobis(d[,1:2],m1,pSigma)
P1 <-exp((-1/2)*p1)/ (2*pi*sqrt(det(pSigma)));#P1
p2 <- mahalanobis(d[,1:2],m2,pSigma)
P2 <- exp((-1/2)*p2)/(2*pi*sqrt(det(pSigma)));#P2
判別関数.
#判別関数
mahalanobis(m,m1,pSigma)
## [1] 2.317319
mahalanobis(m,m2,pSigma)
## [1] 2.317319
#事前確率による修正
P <- log(P1/P2)-mean(log(P1/P2))
mean(P)
## [1] -1.589032e-15
mean(log(P1/P2))
## [1] 3.791977
log(1000/100)
## [1] 2.302585
var(P[1:1000])
## [1] 9.281404
var(P[1001:1100])
## [1] 9.795843
#判別関数の群内分散が1になるようにするとIDRの結果と一致する
varp <- (var(P[1:1000])*999+var(P[1001:1100])*99)/1098
varp
## [1] 9.327788
par(mfrow=c(3,1))
hist(P[1:1000]/sqrt(varp),xlim=c(-15,15))
hist(P[1001:1100]/sqrt(varp),xlim=c(-15,15))
hist(P[1:1100]/sqrt(varp),xlim=c(-15,15))
head(P/sqrt(varp))
## [1] 1.2854222 -0.9265079 0.2679947 -0.2505863 0.9204135 0.6037374
var(P[1:1000]/sqrt(varp))
## [1] 0.9950273
var(P[1001:1100]/sqrt(varp))
## [1] 1.050179
#判別関数の値
head(predict(Z)$x)
## LD1
## 1 -1.2858711
## 2 0.9250043
## 3 -0.2719654
## 4 0.2462930
## 5 -0.9169894
## 6 -0.5919564
mean(predict(Z)$x)
## [1] 8.114721e-16
mean(P/sqrt(varp))
## [1] 3.22974e-17
par(mfrow=c(3,1))
hist(log(1000/100)+log(P1/P2))
hist(log(P1/P2))
plot(Z,dimen=2)
par(mfrow=c(2,1))
hist(P[1001:1100]/sqrt(varp),xlim=c(-5,5))
hist(P[1:1000]/sqrt(varp),xlim=c(-5,5))
head(round(predict(Z)$posterior,5))
## A B
## 1 0.99995 0.00005
## 2 0.96316 0.03684
## 3 0.99899 0.00101
## 4 0.99515 0.00485
## 5 0.99986 0.00014
## 6 0.99962 0.00038
head(1000*P1/(1000*P1+100*P2))
## [1] 0.9999555 0.9632040 0.9990063 0.9951756 0.9998644 0.9996434
羽石先生の資料p12-p15 を参考にして整理する。
(事後確率)=(事前確率)×(尤度) であるから、
\(P(G_A|x) \propto
P(G_A)~P(x|G_A)\).
Aの判別関数 \(g_A(x)=\log
P(G_A)-\dfrac{1}{2}~M_A^2\) (\(M_A^2\) はマハラノビスの距離).
同様に.
Bの判別関数 \(g_B(x)=\log
P(G_B)-\dfrac{1}{2}~M_B^2\) (\(M_B^2\) はマハラノビスの距離).
2群を判別する関数は、
\(f(x)=\log
\dfrac{P(G_A)}{P(G_B)}-\dfrac{1}{2}(M_A^2-M_B^2)\).
第2項はマハラノビスの距離の差であり、事前確率を考慮しない判別境界を表す。
\(\Sigma^{-1}=\dfrac{1}{204}\begin{pmatrix}20&-14\\-14&20\end{pmatrix}=\dfrac{1}{102}\begin{pmatrix}10&-7\\-7&10\end{pmatrix}\) であるので、
\(M_A^2=\dfrac{1}{102}\left[10(x_1-30)^2-14(x_1-30)(x_2-50)+10(x_2-50)^2\right]\).
\(M_B^2=\dfrac{1}{102}\left[10(x_1-40)^2-14(x_1-40)(x_2-50)+10(x_2-50)^2\right]\).
\(-\dfrac{1}{2}(M_A^2-M_B^2)=-\dfrac{1}{2\cdot
102}\left[200(x_1-35)-140(x_2-50)\right]=-\dfrac{70}{102}\left(\dfrac{10}{7}x_1-x_2\right)\).
これは事前確率を考慮しないときの判別直線であり、事前確率を考慮する場合は
\(\log \dfrac{P(G_A)}{P(G_B)}\)
だけ平行移動することになる。
\(x_2=\dfrac{10}{7}x_1-\dfrac{102}{70}\log
\dfrac{P(G_A)}{P(G_B)}\).
plot(dA[,1:2],xlim=c(20,50),ylim=c(35,65))
par(new=T)
plot(dB[,1:2],xlim=c(20,50),ylim=c(35,65),col="red")
abline(-102/70*log(10),10/7)
判別直線が平行移動し、Aの判別領域が広くなっている。
plot(dA[,1:2],xlim=c(20,50),ylim=c(35,65))
par(new=T)
plot(dB[,1:2],xlim=c(20,50),ylim=c(35,65),col="red")
d <- rbind(dA,dB)
(Z<- lda(Z~ .,data=d))
## Call:
## lda(Z ~ ., data = d)
##
## Prior probabilities of groups:
## A B
## 0.90909091 0.09090909
##
## Group means:
## X Y
## A 29.86527 49.86680
## B 40.02171 50.45149
##
## Coefficients of linear discriminants:
## LD1
## X 0.3104140
## Y -0.2012189
k <- Z $ scaling;k
## LD1
## X 0.3104140
## Y -0.2012189
m[1]*k[1]/k[2]+m[2]
## [1] -3.747055
b <- m[1]*k[1]/k[2]+m[2]-(102/70)*log((1000/100))
a <- (-1)*k[1]/k[2]
abline(b,a)
b
## [1] -7.10225
ldaから得られた判別直線を平行移動しても、ほぼ同じ結果が得られている。
事前確率を考慮することにより、誤判別確率を最小にすることができる。このことを計算で確かめるのが、次の人文2022②である。
判別関数.
\(P(A|x)>P(B|x) \Leftrightarrow
\pi_Af_A(x)>\pi_Bf_B(x)\Leftrightarrow
\dfrac{\pi_Af_A(x)}{\pi_Bf_B(x)}>1\)と考え、.
判別関数\(f_q(x)\)として、
\(f_q(x)=\log\left[\dfrac{\pi_Af_A(x)}{\pi_Bf_B(x)}\right]=\log\pi_A+\log
f_A(x)-\log\pi_B-\log f_B(x)\).
とするなら、
\(X\) が部分母集団 Aに由来と判定する条件は、\(f_q(x)>0\) と表される。.
特に、
部分母集団が正規分布で記述されているときは,簡単な判別規則をつくることができる.
平均 μ,分散共分散行列 Σ の 2次元正規分布の密度関数は,
\(f(x,y)=\dfrac{1}{\left(\sqrt{2\pi}\right)^2\sqrt{|\Sigma|}}\exp\left[{-\dfrac{1}{2}D^2}\right]
=
\dfrac{1}{\left(\sqrt{2\pi}\right)^2\sqrt{|\Sigma|}}\exp\left[{-\dfrac{1}{2}D^2}\right]\).
\(P(y=1|x)~,~P(y=-1|x)\) の大小を比較するため、\(\left. P(y=1|x) \right/ P(y=-1|x)\) と1を比べる。
これは、\(f_q(x)=\log\left[\left. P(y=1|x) \right/ P(y=-1|x)\right]\) と0を比べることと同じである。
\(P(y=1|x)=\dfrac{P(y=1)P(x|y=1)}{P(x)}\)、\(P(y=-1|x)=\dfrac{P(y=-1)P(x|y=-1)}{P(x)}\) より、
\(\dfrac{P(y=1|x)}{P(y=-1|x)}=\dfrac{P(y=1)P(x|y=1)}{P(y=-1)P(x|y=-1)}=\dfrac{\pi_1P(x|y=1)}{\pi_2P(x|y=-1)}\).
よって、
\(f_q(x)=\log{\dfrac{\pi_1}{\pi_2}}+\log{\dfrac{P(x|y=1)}{P(x|y=-1)}}\)
\(f_q(x)=\log{\dfrac{\pi_1}{\pi_2}}+\log{\dfrac{\sqrt{|\Sigma_2|}}{\sqrt{|\Sigma_1|}}}-\dfrac{1}{2}(x-\mu_1)'\ \Sigma_1^{-1}(x-\mu_1)+\dfrac{1}{2}(x-\mu_2)'\ \Sigma_2^{-1}(x-\mu_2)\).
正規母集団で事前確率が等しく、かつ分散共分散行列が等しければ、
\(f_q(x)=-\dfrac{1}{2}D_1^2+\dfrac{1}{2}D_2^2\).
これが判別関数である。
\(D_1^2=\begin{pmatrix}x_1-1&x_2-1\end{pmatrix}\Sigma^{-1}\begin{pmatrix}x_1-1\\x_2-1\end{pmatrix}=\dfrac{1}{0.75}\left[(x_1-1)^2-(x_1-1)(x_2-1)+(x_2-1)^2\right]\).
\(D_2^2=\begin{pmatrix}x_1+1&x_2+1\end{pmatrix}\Sigma^{-1}\begin{pmatrix}x_1+1\\x_2+1\end{pmatrix}=\dfrac{1}{0.75}\left[(x_1+1)^2-(x_1+1)(x_2+1)+(x_2+1)^2\right]\).
辺々引くと、
\(D_1^2-D_2^2=\dfrac{1}{0.75}\left[-4x_1-4x_2+2(x_1+x_2)\right]=\dfrac{1}{0.75}\left[-2x_1-2x_2\right]\).
判別関数は. \(f_q(x)=-\dfrac{1}{2}D_1^2+\dfrac{1}{2}D_2^2=\dfrac{1}{0.75}\left[x_1+x_2\right]\).
本問では (3)は、マハラノビスの距離を利用した判別.
\(\displaystyle P(x\mid G_1 )=\dfrac{2}{2\pi\sqrt{3}}\exp\left[-\dfrac{1}{2\cdot 0.75}\left[(x_1-1)^2-(x_1-1)(x_2-1)+(x_2-1)^2\right]\right]\).
(4)は、誤判別確率最小の分離点を考える問題である。
射影によって得られる2つの正規分布関数の交点が、最適誤判別確率となる分離点である。
\(f_q(x)=\log{\dfrac{\pi_1}{\pi_2}}+\log{\dfrac{\sqrt{|\Sigma_2|}}{\sqrt{|\Sigma_1|}}}-\dfrac{1}{2}(x-\mu_1)'\
\Sigma_1^{-1}(x-\mu_1)+\dfrac{1}{2}(x-\mu_2)'\
\Sigma_2^{-1}(x-\mu_2)\).
において、分散共分散行列が共通なので.
\(f_q(x)=\log{\dfrac{\pi_1}{\pi_2}}-\dfrac{1}{2}(x-\mu_1)'\
\Sigma_1^{-1}(x-\mu_1)+\dfrac{1}{2}(x-\mu_2)'\
\Sigma_2^{-1}(x-\mu_2)\).
即ち、
\(f_q(x)=\log{\dfrac{\pi_1}{\pi_2}}-\dfrac{1}{2}D_1^2+\dfrac{1}{2}D_2^2\) よって、
\(f_q(x)=\log{2}+\dfrac{1}{0.75}\left[x_1+x_2\right]\).
これが誤判別確率最小の判別関数であり、
G1に帰属する条件は、
\(f_q(x)=\log{2}+\dfrac{1}{0.75}\left[x_1+x_2\right]>0\).
即ち、 \(x_1+x_2>-0.75\log{2}\).
\(x_1+x_2<-0.75\log{2}\)
であれば誤判別になるので、
\(c=-0.75\log2=-0.5198\)
サンプル数は、100,100 とする。
library(MASS)
mA <- c(1,1)
mB <- c(-1,-1)
Sigma <- matrix(c(1,0.5,0.5,1), 2, 2)
Sigma
## [,1] [,2]
## [1,] 1.0 0.5
## [2,] 0.5 1.0
dataA <- mvrnorm(100, mA, Sigma)
dataB <- mvrnorm(100, mB, Sigma)
dA <- data.frame(X=dataA[,1],Y=dataA[,2],Z=rep("A",100))
dB <- data.frame(X=dataB[,1],Y=dataB[,2],Z=rep("B",100))
plot(dA[,1:2],xlim=c(-3,3),ylim=c(-3,3))
par(new=T)
plot(dB[,1:2],xlim=c(-3,3),ylim=c(-3,3),col="red")
d <- rbind(dA,dB)
mean(dA[,1]);mean(dB[,1])
## [1] 0.81774
## [1] -0.8794717
mean(dA[,2]);mean(dB[,2])
## [1] 0.9775502
## [1] -0.9459068
#中心点
m1 <- c(mean(dA[,1]),mean(dA[,2]))
m2 <- c(mean(dB[,1]),mean(dB[,2]))
m <- (m1+m2)/2;m
## [1] -0.03086590 0.01582174
#線形判別
(Z<- lda(Z~ .,data=d))
## Call:
## lda(Z ~ ., data = d)
##
## Prior probabilities of groups:
## A B
## 0.5 0.5
##
## Group means:
## X Y
## A 0.8177400 0.9775502
## B -0.8794717 -0.9459068
##
## Coefficients of linear discriminants:
## LD1
## X -0.5581340
## Y -0.6061336
k <- Z $ scaling;k #法線ベクトル
## LD1
## X -0.5581340
## Y -0.6061336
b <- m[1]*k[1]/k[2]+m[2];b #切片
## [1] -0.01259989
a <- (-1)*k[1]/k[2];a #傾き
## [1] -0.9208101
abline(b,a)
法線ベクトルを \(k=(a,b)\)
とすると、判別直線は.
\(y=-\dfrac{a}{b}x+c\).
事前確率が等しいときは平均点を通るので、
\(c=\bar{x}\cdot
\dfrac{a}{b}+\bar{y}\).
これが切片である。
判別関数の値.
head(predict(Z)$x)
## LD1
## 1 -0.4352809
## 2 -1.2781468
## 3 -1.1580889
## 4 -1.5825380
## 5 -0.7190806
## 6 -0.6596612
plot(Z,dim=2)
## Warning in rect(breaks[-n], 0, breaks[-1L], est[[grp]], col = col, ...): "dim"
## is not a graphical parameter
## Warning in rect(breaks[-n], 0, breaks[-1L], est[[grp]], col = col, ...): "dim"
## is not a graphical parameter
var(predict(Z)$x)
## LD1
## LD1 2.116929
han<- (d[,1]+d[,2])/0.75
head(han)
## [1] 0.9693547 2.8960202 2.6745837 3.6333936 1.6631878 1.4991817
v <- (var(han[1:100])*99+var(han[101:200])*99)/198
head(han/sqrt(v))
## [1] 0.4241878 1.2672929 1.1703927 1.5899661 0.7278078 0.6560390
mean(han/sqrt(v))
## [1] -0.008777726
var(han/sqrt(v))
## [1] 2.116277
(v <- (var(han[1:100]/sqrt(v))*99+var(han[101:200]/sqrt(v))*99)/198)
## [1] 1
LDAの判別値は事前確率を考慮していない。
サンプル数は、200,100 とする。
hanbetu<- (d[,1]+d[,2])+0.52 par(mfrow=c(3,1))
hist(hanbetu[1:100],xlim=c(-8,8)) hist(hanbetu[101:200],xlim=c(-8,8))
hist(hanbetu,xlim=c(-8,8)) mean(hanbetu)
library(MASS)
mA <- c(1,1)
mB <- c(-1,-1)
Sigma <- matrix(c(1,0.5,0.5,1), 2, 2)
Sigma
## [,1] [,2]
## [1,] 1.0 0.5
## [2,] 0.5 1.0
dataA <- mvrnorm(200, mA, Sigma)
dataB <- mvrnorm(100, mB, Sigma)
dA <- data.frame(X=dataA[,1],Y=dataA[,2],Z=rep("A",200))
dB <- data.frame(X=dataB[,1],Y=dataB[,2],Z=rep("B",100))
plot(dA[,1:2],xlim=c(-3,3),ylim=c(-3,3))
par(new=T)
plot(dB[,1:2],xlim=c(-3,3),ylim=c(-3,3),col="red")
d <- rbind(dA,dB)
#中心点
m1 <- c(mean(dA[,1]),mean(dA[,2]))
m2 <- c(mean(dB[,1]),mean(dB[,2]))
m <- (m1+m2)/2;m
## [1] 0.04745166 0.07642428
#線形判別
(Z<- lda(Z~ .,data=d))
## Call:
## lda(Z ~ ., data = d)
##
## Prior probabilities of groups:
## A B
## 0.6666667 0.3333333
##
## Group means:
## X Y
## A 0.9712157 1.0124803
## B -0.8763124 -0.8596317
##
## Coefficients of linear discriminants:
## LD1
## X -0.6136808
## Y -0.4974974
k <- Z $ scaling;k
## LD1
## X -0.6136808
## Y -0.4974974
b <- m[1]*k[1]/k[2]+m[2]+log(200/100)/k[2];b
## [1] -1.25831
b1 <- m[1]*k[1]/k[2]+m[2];b1
## [1] 0.1349576
a <- (-1)*k[1]/k[2];a
## [1] -1.233536
abline(b,a)
abline(b1,a,col="lightblue")
事前分布の差のため、判別直線は移動している。
(傾きも結構変わる印象ではある).
判別関数の値.
head(predict(Z)$x)
## LD1
## 1 -0.66079467
## 2 -0.08285781
## 3 0.56051918
## 4 -1.32821881
## 5 -0.06878805
## 6 0.43688315
plot(Z,dim=2)
## Warning in rect(breaks[-n], 0, breaks[-1L], est[[grp]], col = col, ...): "dim"
## is not a graphical parameter
## Warning in rect(breaks[-n], 0, breaks[-1L], est[[grp]], col = col, ...): "dim"
## is not a graphical parameter
var(predict(Z)$x)
## LD1
## LD1 1.947581
mean(predict(Z)$x)
## [1] -1.006602e-16
han<- (d[,1]+d[,2])/0.75
head(han)
## [1] 2.39048771 1.48480793 -0.53189650 4.11985057 1.05215649 -0.01536868
var(han)
## [1] 11.25008
v <- (var(han[1:100])*99+var(han[101:200])*99)/198
mean(han/sqrt(v))
## [1] 0.4186222
var(han/sqrt(v))
## [1] 2.004434
(vp <- (var(han[1:100]/sqrt(v))*99+var(han[101:200]/sqrt(v))*99)/198)
## [1] 1
sqrt(v)
## [1] 2.369092
par(mfrow=c(2,1))
hist(-han/sqrt(v))
hist(predict(Z)$x)
var(-han/sqrt(v))
## [1] 2.004434
var(predict(Z)$x)
## LD1
## LD1 1.947581
事後確率.
head(predict(Z)$posterior)#判別の事後確率
## A B
## 1 0.9409559 0.05904405
## 2 0.8285064 0.17149360
## 3 0.5612902 0.43870975
## 4 0.9844336 0.01556639
## 5 0.8243385 0.17566152
## 6 0.6228655 0.37713451
Y <- han/sqrt(v)-mean(han/sqrt(v))
head(-Y)
## [1] -0.5904089 -0.2081191 0.6431371 -1.3203775 -0.0254958 0.4251094