KERNEL
KERNEL
## [1] "linear" "polynomial" "sigmoid" "radial"
d2 <- read.csv(file = 'https://stats.dip.jp/01_ds/data/data_svm_cluster7.csv')
matplot(NA, type = 'n',
xlim = c(-10, 15), ylim = c(-10, 20),
xlab = 'x', ylab = 'y')
grid()
d2.red <- d2[d2$blue == 0, ]
d2.blue <- d2[d2$blue == 1, ]
matlines(x = d2.red$x, y = d2.red$y, type = 'p', pch = 1, col = COL[1])
matlines(x = d2.blue$x, y = d2.blue$y, type = 'p', pch = 1, col = COL[2])
legend('topright', col = COL[1:2], pch = c(1, 1), bg = 'white',
legend = c('赤', '青'))

library(e1071)
cv <- tune('svm', as.factor(blue) ~ ., data = d2,
kernel = KERNEL[k], type = 'C-classification',
ranges = list(#gamma = 2^(-4:4), # radialなどの非線形カーネルを使うとき調整
#epsilon = seq(0, 1, 0.1), # SVRの不感帯の調整
#coef0 = 2^(-4:4), # polynomialかsigmoidのとき調整(c0)
cost = 2^(-4:4))) # コスト係数(小さいほど分類誤りを許容)
# ベストパラメータ表示
cv
##
## Parameter tuning of 'svm':
##
## - sampling method: 10-fold cross validation
##
## - best parameters:
## cost
## 0.0625
##
## - best performance: 0.2814286
draw.fig <- function(d2)
{
# データ抽出
d.red <- d2[d2$blue == 0, ] # 赤クラスデータ
d.blue <- d2[d2$blue == 1, ] # 青クラスデータ
# 図枠
matplot (NA, type = 'n',
xlim = c(-10, 15), ylim = c(-10, 20),
xlab = 'x', ylab = 'y')
grid() # 格子線
# 描画
matlines(x = d.red$x, y = d.red$y, type = 'p', pch = 1, col = COL[2])
matlines(x = d.blue$x, y = d.blue$y, type = 'p', pch = 1, col = COL[1])
# 凡例
legend('topright', col = COL[1:2], pch = c(1, 1), bg = 'white',
legend = c('赤', '青'))
}
#cairo_pdf('data_svm.pdf') # 講義資料PDF画像作成(ここから)
dx <- 0.2
dy <- 0.2
dgrid <- expand.grid(x = seq(-25, 25, dx),
y = seq(-25, 25, dy))
pred <- predict(cv$best.model, newdata = dgrid)
draw.fig(d2)
sv <- d2[cv$best.model$index, -1]
matpoints(x = sv[, 1], y = sv[, 2], pch = 16, cex = 0.5, col = 1)
dgrid.blue <- dgrid[pred == 1, ]
fill.cell <- function(x, y)
{
xline <- c(x - dx/2, x + dx/2)
ylow <- c(y - dy/2, y - dy/2)
yupp <- c(y + dy/2, y + dy/2)
polygon(c(xline, rev(xline)), c(ylow, yupp), border = F, col = COL[4])
}
for (i in 1:nrow(dgrid))
{
if (pred[i] == 1) fill.cell(dgrid$x[i], dgrid$y[i])
}
title(paste0('SVM(カーネル:', KERNEL[k], ')による分類'))
legend('topright', col = c(COL[1:2], 1, NA), pch = c(1, 1, 16, NA),
fill = c(NA, NA, NA, COL[4]), border = F, bg = 'white',
legend = c('赤(0)', '青(1)', 'サポートベクター', '青(1)と分類する範囲'))

KERNEL <- c('linear', # 線形
'polynomial', # 多項式
'sigmoid', # シグモイド
'radial') # ガウス
k <- 2 # カーネル選択番号
cv <- tune('svm', as.factor(blue) ~ ., data = d2,
kernel = KERNEL[k], type = 'C-classification',
ranges = list(#gamma = 2^(-4:4), # radialなどの非線形カーネルを使うとき調整
#epsilon = seq(0, 1, 0.1), # SVRの不感帯の調整
#coef0 = 2^(-4:4), # polynomialかsigmoidのとき調整(c0)
cost = 2^(-4:4))) # コスト係数(小さいほど分類誤りを許容)
# ベストパラメータ表示
cv
##
## Parameter tuning of 'svm':
##
## - sampling method: 10-fold cross validation
##
## - best parameters:
## cost
## 0.0625
##
## - best performance: 0.1528571
draw.fig <- function(d2)
{
# データ抽出
d.red <- d2[d2$blue == 0, ] # 赤クラスデータ
d.blue <- d2[d2$blue == 1, ] # 青クラスデータ
# 図枠
matplot (NA, type = 'n',
xlim = c(-10, 15), ylim = c(-10, 20),
xlab = 'x', ylab = 'y')
grid() # 格子線
# 描画
matlines(x = d.red$x, y = d.red$y, type = 'p', pch = 1, col = COL[2])
matlines(x = d.blue$x, y = d.blue$y, type = 'p', pch = 1, col = COL[1])
# 凡例
legend('topright', col = COL[1:2], pch = c(1, 1), bg = 'white',
legend = c('赤', '青'))
}
dx <- 0.2
dy <- 0.2
dgrid <- expand.grid(x = seq(-25, 25, dx),
y = seq(-25, 25, dy))
pred <- predict(cv$best.model, newdata = dgrid)
draw.fig(d2)
sv <- d2[cv$best.model$index, -1]
matpoints(x = sv[, 1], y = sv[, 2], pch = 16, cex = 0.5, col = 1)
dgrid.blue <- dgrid[pred == 1, ]
fill.cell <- function(x, y)
{
xline <- c(x - dx/2, x + dx/2)
ylow <- c(y - dy/2, y - dy/2)
yupp <- c(y + dy/2, y + dy/2)
polygon(c(xline, rev(xline)), c(ylow, yupp), border = F, col = COL[4])
}
for (i in 1:nrow(dgrid))
{
if (pred[i] == 1) fill.cell(dgrid$x[i], dgrid$y[i])
}
title(paste0('SVM(カーネル:', KERNEL[k], ')による分類'))
legend('topright', col = c(COL[1:2], 1, NA), pch = c(1, 1, 16, NA),
fill = c(NA, NA, NA, COL[4]), border = F, bg = 'white',
legend = c('赤(0)', '青(1)', 'サポートベクター', '青(1)と分類する範囲'))

KERNEL <- c('linear', # 線形
'polynomial', # 多項式
'sigmoid', # シグモイド
'radial') # ガウス
k <- 3 # カーネル選択番号
cv <- tune('svm', as.factor(blue) ~ ., data = d2,
kernel = KERNEL[k], type = 'C-classification',
ranges = list(#gamma = 2^(-4:4), # radialなどの非線形カーネルを使うとき調整
#epsilon = seq(0, 1, 0.1), # SVRの不感帯の調整
#coef0 = 2^(-4:4), # polynomialかsigmoidのとき調整(c0)
cost = 2^(-4:4))) # コスト係数(小さいほど分類誤りを許容)
# ベストパラメータ表示
cv
##
## Parameter tuning of 'svm':
##
## - sampling method: 10-fold cross validation
##
## - best parameters:
## cost
## 0.0625
##
## - best performance: 0.5042857
draw.fig <- function(d2)
{
# データ抽出
d.red <- d2[d2$blue == 0, ] # 赤クラスデータ
d.blue <- d2[d2$blue == 1, ] # 青クラスデータ
# 図枠
matplot (NA, type = 'n',
xlim = c(-10, 15), ylim = c(-10, 20),
xlab = 'x', ylab = 'y')
grid() # 格子線
# 描画
matlines(x = d.red$x, y = d.red$y, type = 'p', pch = 1, col = COL[2])
matlines(x = d.blue$x, y = d.blue$y, type = 'p', pch = 1, col = COL[1])
# 凡例
legend('topright', col = COL[1:2], pch = c(1, 1), bg = 'white',
legend = c('赤', '青'))
}
dx <- 0.2
dy <- 0.2
dgrid <- expand.grid(x = seq(-25, 25, dx),
y = seq(-25, 25, dy))
pred <- predict(cv$best.model, newdata = dgrid)
draw.fig(d2)
sv <- d2[cv$best.model$index, -1]
matpoints(x = sv[, 1], y = sv[, 2], pch = 16, cex = 0.5, col = 1)
dgrid.blue <- dgrid[pred == 1, ]
fill.cell <- function(x, y)
{
xline <- c(x - dx/2, x + dx/2)
ylow <- c(y - dy/2, y - dy/2)
yupp <- c(y + dy/2, y + dy/2)
polygon(c(xline, rev(xline)), c(ylow, yupp), border = F, col = COL[4])
}
for (i in 1:nrow(dgrid))
{
if (pred[i] == 1) fill.cell(dgrid$x[i], dgrid$y[i])
}
title(paste0('SVM(カーネル:', KERNEL[k], ')による分類'))
legend('topright', col = c(COL[1:2], 1, NA), pch = c(1, 1, 16, NA),
fill = c(NA, NA, NA, COL[4]), border = F, bg = 'white',
legend = c('赤(0)', '青(1)', 'サポートベクター', '青(1)と分類する範囲'))

KERNEL <- c('linear', # 線形
'polynomial', # 多項式
'sigmoid', # シグモイド
'radial') # ガウス
k <- 4 # カーネル選択番号
cv <- tune('svm', as.factor(blue) ~ ., data = d2,
kernel = KERNEL[k], type = 'C-classification',
ranges = list(#gamma = 2^(-4:4), # radialなどの非線形カーネルを使うとき調整
#epsilon = seq(0, 1, 0.1), # SVRの不感帯の調整
#coef0 = 2^(-4:4), # polynomialかsigmoidのとき調整(c0)
cost = 2^(-4:4))) # コスト係数(小さいほど分類誤りを許容)
# ベストパラメータ表示
cv
##
## Parameter tuning of 'svm':
##
## - sampling method: 10-fold cross validation
##
## - best parameters:
## cost
## 8
##
## - best performance: 0.01571429
draw.fig <- function(d2)
{
# データ抽出
d.red <- d2[d2$blue == 0, ] # 赤クラスデータ
d.blue <- d2[d2$blue == 1, ] # 青クラスデータ
# 図枠
matplot (NA, type = 'n',
xlim = c(-10, 15), ylim = c(-10, 20),
xlab = 'x', ylab = 'y')
grid() # 格子線
# 描画
matlines(x = d.red$x, y = d.red$y, type = 'p', pch = 1, col = COL[2])
matlines(x = d.blue$x, y = d.blue$y, type = 'p', pch = 1, col = COL[1])
# 凡例
legend('topright', col = COL[1:2], pch = c(1, 1), bg = 'white',
legend = c('赤', '青'))
}
dx <- 0.2
dy <- 0.2
dgrid <- expand.grid(x = seq(-25, 25, dx),
y = seq(-25, 25, dy))
pred <- predict(cv$best.model, newdata = dgrid)
draw.fig(d2)
sv <- d2[cv$best.model$index, -1]
matpoints(x = sv[, 1], y = sv[, 2], pch = 16, cex = 0.5, col = 1)
dgrid.blue <- dgrid[pred == 1, ]
fill.cell <- function(x, y)
{
xline <- c(x - dx/2, x + dx/2)
ylow <- c(y - dy/2, y - dy/2)
yupp <- c(y + dy/2, y + dy/2)
polygon(c(xline, rev(xline)), c(ylow, yupp), border = F, col = COL[4])
}
for (i in 1:nrow(dgrid))
{
if (pred[i] == 1) fill.cell(dgrid$x[i], dgrid$y[i])
}
title(paste0('SVM(カーネル:', KERNEL[k], ')による分類'))
legend('topright', col = c(COL[1:2], 1, NA), pch = c(1, 1, 16, NA),
fill = c(NA, NA, NA, COL[4]), border = F, bg = 'white',
legend = c('赤(0)', '青(1)', 'サポートベクター', '青(1)と分類する範囲'))
