hangscer

logistic regression处理分类问题

2017/05/16

logistic regresion虽然名字里有”回归”,但是它实际上是分类方法,用于二元分类问题(即输出两种结果).需要找到一个预测函数,该函数输出为两种值(分别代表两种类别),所以利用了Logistic函数,形式为,其函数图像为:

对于线下边界而言:

构造预测函数:

构造cost函数:


分类问题最终需要决定决策边界.决策边界分为线性决策边界与非线性决策边界.本博客意在记录学习过程,而非论述其原理.
以下是线性决策边界的小例子.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
object Main extends App {
val dataY0=List((0.5,0.4), (1.0,0.4), (1.5,0.5), (1.9,0.4), (0.7,0.8), (1.3,1.1), (1.9,1.0), (0.9,1.7), (1.5,1.5))
val dataY1=List((2.9,2.2), (2.85,2.5), (2.85,3.2), (2.5,2.5), (2.5,3.0), (2.2,2.7), (2.2,3.2), (2.0,2.8), (1.9,3.0), (1.5,3.1))
var θ0:Double=0.0
import util.{Hθ,t}
var θ1:Double=0.0
var θ2:Double=0.0
var tempSum=0.0
var a=0.01
for(_ <-1 to 1000){
tempSum=0.0
dataY0.foreach(item=>{
tempSum=tempSum+Hθ(θ012,item._1,item._2)-0.0
})
dataY1.foreach(item=>{
tempSum=tempSum+Hθ(θ012,item._1,item._2)-1.0
})
θ0 = θ0 - a*tempSum
tempSum=0.0
dataY0.foreach(item=>{
tempSum=tempSum + (Hθ(θ012,item._1,item._2)-0.0)*item._1
})
dataY1.foreach(item=>{
tempSum=tempSum+ (Hθ(θ012,item._1,item._2)-1.0)*item._1
})
θ11-a*tempSum
tempSum=0.0
dataY0.foreach(item=>{
tempSum=tempSum+(Hθ(θ012,item._1,item._2)-0.0)*item._2
})
dataY1.foreach(item=>{
tempSum=tempSum+(Hθ(θ012,item._1,item._2)-1.0)*item._2
})
θ22-a*tempSum
}
val f=Figure()
val p2=f.subplot(0)
p2 += scatter(dataY0.map(_._1),dataY0.map(_._2),radius=>0.1,colors = x=>Color.BLACK)
p2 += scatter(dataY1.map(_._1),dataY1.map(_._2),radius=>0.1,colors = x=>Color.RED)
p2 += plot(-1.0 to 5 by 0.1, -1.0 to 5 by 0.1 map(i=>t(θ012,i)))
f.saveas("hah.png")
}
object util{
def 0:Double1:Double2:Double,x1:Double,x2:Double):Double={
g(θ0 + θ1*x1 + θ2*x2)
}
def g(z:Double)= 1.0/(1.0+math.exp(-z))
def t0:Double1:Double2:Double,x1:Double)=(-θ01*x1)/θ2
}

分类效果为: