==== 課題#1 学習誤差と予測誤差 ====
- 初稿 2011.11.07
- 第二稿 2011.11.10
=== はじめに ===
今回は比較的単純な課題です.
- 線形学習機械の最小二乗学習とk最近接機械の誤判別率を,シミュレーションを用いて比較しなさい.
- 今回のシミュレーション設定に対して,最適なkを決めてみなさい.
- 学習用データによる誤判別率の推定と検証ゥデータによる誤判別率の推定を比較して考察しなさい.
〆切は来週の月曜日の2限が始まる時刻まで,とします.Word形式のレポートファイルの送付先は,[[mailto:data.mining.finale_at_gmail.com]]です.(_at_を半角の@マークで置き換えてください)
コードは,解説付きのコードの一番下に「貼り付け用」を別に用意したので,そちらを使うと良いです.いきなり全部をコピーするのでなく,四角囲みごとに.
=== コード ===
# データを発生させる関数
generate.data <- function(n, p, k, setting) {
# 最初に空の変数を作るとあとのコードが便利
X <- NULL
y <- NULL
if( setting==1 ) {
X <- rbind(X,
cbind(rnorm(ceiling(n/2), mean=0, sd=1),
rnorm(ceiling(n/2), mean=0, sd=1)) )
y <- rbind(y,
as.matrix(array(0, dim=c(ceiling(n/2)) ) ) )
X <- rbind(X,
cbind(rnorm(floor(n/2), mean=2, sd=1),
rnorm(floor(n/2), mean=2, sd=1)) )
y <- rbind(y,
as.matrix(array(1, dim=c(floor(n/2)) ) ) )
Data <- cbind(X,y)
colnames(Data) <- c("X.1", "X.2", "y")
# 最後にデータのランダムな並べ替え
Data.ret <- Data[sample(c(1:n)),]
return(Data.ret)
}
}
# データセットを最初のn.learnレコードを学習用に,残りを検証用に,分割する関数
split.data <- function(dataset, n.learn) {
data.learn <- dataset[c(1:n.learn),]
data.eval <- dataset[-c(1:n.learn),]
return(list(learn=data.learn, eval=data.eval))
}
# シミュレーション回数
m <- 1000
# データの変数の次元 (今回は未使用の変数)
p <- 2
# クラス数 (これも今回は未使用の変数)
k <- 2
# 学習用データのレコード数
n.learn <- 50
# 検証用データのレコード数
n.eval <- 20
# サンプル数
n <- n.learn + n.eval
# {}内に書かれたシミュレーションをm回繰り返す.
error.rate.eval <- NULL
error.rate.learn <- NULL
for( i in c(1:m) ) {
# データの生成と分割
data.gen <- generate.data(n,2,2,setting=1)
data.split <- split.data(data.gen, n.learn)
data.learn <- data.frame(data.split$learn)
data.eval <- data.frame(data.split$eval)
# 準備
error.temp.learn <- NULL
error.temp.eval <- NULL
# 各種学習機械の適用
# 線形学習機械の最小二乗学習
data.lm <- lm(y~X.1+X.2, data=data.learn)
data.fit <- fitted(data.lm)
data.pred <- predict(data.lm, newdata=data.eval)
# print(data.eval$y-data.pred)
# print(sum(abs(data.eval$y-data.pred)<0.5)/n.eval)
# print(data.learn$y-data.fit)
# print(sum(abs(data.learn$y-data.fit)<0.5)/n.learn)
# 学習用データの当てはめ誤差
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-data.fit)<0.5)/n.learn)
# 検証用データの当てはめ誤差
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-data.pred)<0.5)/n.eval)
# k-最近接機械でk=1
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=1, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=1, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# k-最近接機械でk=3
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=3, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=3, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# k-最近接機械でk=5
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=5, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=5, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# k-最近接機械でk=7
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=7, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=7, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# k-最近接機械でk=9
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=9, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=9, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# k-最近接機械でk=15
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=15, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=15, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# k-最近接機械でk=21
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=21, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=21, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# k-最近接機械でk=25
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=31, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=31, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# k-最近接機械でk=51
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=51, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=51, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# k-最近接機械でk=75
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=75, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=75, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# k-最近接機械でk=101
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=101, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=101, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# k-最近接機械でk=201
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=201, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=201, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# k-最近接機械でk=301
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=301, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=301, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# 上の結果の回収
error.rate.learn <- rbind(error.rate.learn, error.temp.learn)
error.rate.eval <- rbind(error.rate.eval, error.temp.eval)
}
# 最後に少しお化粧
colnames(error.rate.learn) <- c("lm", "knn.1", "knn.3", "knn.5", "knn.7",
"knn.9", "knn.15", "knn.21", "knn.25", "knn.51", "knn.75",
"knn.101", "knn.201", "knn.301")
rownames(error.rate.learn) <- c(1:m)
colnames(error.rate.eval) <- c("lm", "knn.1", "knn.3", "knn.5", "knn.7",
"knn.9", "knn.15", "knn.21", "knn.25", "knn.51", "knn.75",
"knn.101", "knn.201", "knn.301")
rownames(error.rate.eval) <- c(1:m)
学習用データによる誤判別率の推定値の標本分布を要約する.次の3行を実施すれば,箱ひげ図が描けて,各学習機械の誤判別率の平均と標準偏差も算出される.
箱ひげ図については,次項参照のこと.
boxplot(error.rate.learn)
apply(error.rate.learn,2,"mean")
sqrt(apply(error.rate.learn,2,"var"))
検証用データにおける誤判別率についても,同様の次の3行で要約できる.
boxplot(error.rate.eval)
apply(error.rate.eval,2,"mean")
sqrt(apply(error.rate.eval,2,"var"))
== 貼り付け用 ==
準備
library(class)
generate.data <- function(n, p, k, setting) {
X <- NULL
y <- NULL
if( setting==1 ) {
X <- rbind(X,
cbind(rnorm(ceiling(n/2), mean=0, sd=1),
rnorm(ceiling(n/2), mean=0, sd=1)) )
y <- rbind(y,
as.matrix(array(0, dim=c(ceiling(n/2)) ) ) )
X <- rbind(X,
cbind(rnorm(floor(n/2), mean=2, sd=1),
rnorm(floor(n/2), mean=2, sd=1)) )
y <- rbind(y,
as.matrix(array(1, dim=c(floor(n/2)) ) ) )
Data <- cbind(X,y)
colnames(Data) <- c("X.1", "X.2", "y")
Data.ret <- Data[sample(c(1:n)),]
return(Data.ret)
}
}
split.data <- function(dataset, n.learn) {
data.learn <- dataset[c(1:n.learn),]
data.eval <- dataset[-c(1:n.learn),]
return(list(learn=data.learn, eval=data.eval))
}
設定
m <- 1000
p <- 2
k <- 2
n.learn <- 500
n.eval <- 200
n <- n.learn + n.eval
シミュレーション実験の実施
error.rate.learn <- NULL
error.rate.eval <- NULL
for( i in c(1:m) ) {
error.temp.learn <- NULL
error.temp.eval <- NULL
data.gen <- generate.data(n,2,2,setting=1)
data.split <- split.data(data.gen, n.learn)
data.learn <- data.frame(data.split$learn)
data.eval <- data.frame(data.split$eval)
# lm
data.lm <- lm(y~X.1+X.2, data=data.learn)
data.pred <- predict(data.lm, newdata=data.eval)
data.fit <- fitted(data.lm)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-data.fit)<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-data.pred)<0.5)/n.eval)
# knn:1
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=1, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=1, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# knn:3
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=3, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=3, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# knn:5
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=5, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=5, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# knn:7
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=7, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=7, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# knn:9
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=9, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=9, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# knn:15
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=15, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=15, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# knn:21
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=21, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=21, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# knn:25
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=31, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=31, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# knn:51
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=51, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=51, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# knn:75
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=75, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=75, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# knn:101
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=101, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=101, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# knn:201
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=201, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=201, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
# knn:301
data.fit <- knn(data.learn[,c(1:2)], data.learn[,c(1:2)], data.learn[,c(3)],
k=301, prob=FALSE)
data.pred <- knn(data.learn[,c(1:2)], data.eval[,c(1:2)], data.learn[,c(3)],
k=301, prob=FALSE)
error.temp.learn <- append(error.temp.learn,
1-sum(abs(data.learn$y-(as.numeric(data.fit)-1))<0.5)/n.learn)
error.temp.eval <- append(error.temp.eval,
1-sum(abs(data.eval$y-(as.numeric(data.pred)-1))<0.5)/n.eval)
error.rate.learn <- rbind(error.rate.learn, error.temp.learn)
error.rate.eval <- rbind(error.rate.eval, error.temp.eval)
}
colnames(error.rate.learn) <- c("lm", "knn.1", "knn.3", "knn.5", "knn.7", "knn.9",
"knn.15", "knn.21", "knn.25", "knn.51", "knn.75",
"knn.101", "knn.201", "knn.301")
rownames(error.rate.learn) <- c(1:m)
colnames(error.rate.eval) <- c("lm", "knn.1", "knn.3", "knn.5", "knn.7", "knn.9",
"knn.15", "knn.21", "knn.25", "knn.51", "knn.75",
"knn.101", "knn.201", "knn.301")
rownames(error.rate.eval) <- c(1:m)
boxplot(error.rate.learn)
apply(error.rate.learn,2,"mean")
sqrt(apply(error.rate.learn,2,"var"))
boxplot(error.rate.eval)
apply(error.rate.eval,2,"mean")
sqrt(apply(error.rate.eval,2,"var"))
=== 解説 ===
== 箱ひげ図 ==
箱ひげ図は,一次元データの打点の要約方法である.ヒストグラムの代替で,対称性と裾の重さを図示する.
下図はデータの散らばり具合,ヒストグラム,箱ひげ図の対応例である
{{ :dmb:2011:pointplot-histogram-boxplot.jpg? |}}
この図の場合,箱ひげ図を横に寝かせて描いたので,右方向を上,左方向を下と思って欲しい.
|ひげの上にある点|1.5倍の範囲を超えたデータ|
|長方形の上に伸びたひげの横線|箱の長さの1.5倍の範囲にあるデータの最大値|
|長方形の上辺|データを小さい順に並べたときの「上側1/4」(75%点)の値|
|長方形中央の横線|データを小さい順に並べたときの「真ん中」(50%点)の値|
|長方形の下辺|データを小さい順に並べたときの「下側1/4」(25%点)の値|
|長方形の下に伸びたひげの横線|箱の長さの1.5倍の範囲にあるデータの最小値|
|ひげの下にある点|1.5倍の範囲を超えたデータ|
|箱の長さ|上辺-下辺|
上の図の作図に用いたコード.
X <- rgamma(100, shape=2)
jpeg("pointplot-histogram-boxplot.jpg", width=600, height=600)
par(mfrow=c(3,1))
plot(cbind(X,1), xlim=c(0,10))
hist(X, xlim=c(0,10))
boxplot(X,horizontal=TRUE, ylim=c(0,10))
dev.off()
== ヒストグラムを並べる場合 ==
グラフの数が多いので,お勧めはしないが,箱ひげ図を描く代わりに,ヒストグラムを並べると,こうなる.
学習用データの誤判別率のグラフを並べた例.
{{ :dmb:2011:histograms-learn.jpg |}}
jpeg("histograms-learn.jpg", width=600, height=1800)
par(cex=0.3)
par(mfrow=c(14,1))
for( i in c(1:14) ) {
hist(error.rate.learn[,i],
xlab=colnames(error.rate.learn)[i],
main=paste("Histogram for ",colnames(error.rate.learn)[i]))
}
dev.off()
こちらは検証用データにおける誤判別率のグラフを並べた例.
{{ :dmb:2011:histograms-eval.jpg |}}
jpeg("histograms-eval.jpg", width=600, height=1800)
par(cex=0.3)
par(mfrow=c(14,1))
for( i in c(1:14) ) {
hist(error.rate.eval[,i],
xlab=colnames(error.rate.eval)[i],
main=paste("Histogram for ",colnames(error.rate.eval)[i]))
}
dev.off()