Logistic邏輯回歸
Logistic邏輯回歸模型
線性回歸模型簡單,對於一些線性可分的場景還是簡單易用的。Logistic邏輯回歸也可以看成線性回歸的變種,雖然名字帶回歸二字但實際上他主要用來二分類,區別於線性回歸直接擬合目標值,Logistic邏輯回歸擬合的是正類和負類的對數幾率。
假設有一個二分類問題,輸出為y∈{0,1}
定義sigmoid函數: 
用sigmoid函數的輸出是0,1之間,用來擬合y=1的概率,其函數R語言畫圖如下:
x = seq(-5, 5, 0.1)
y = 1 / (1 + exp(-1*x))
plot(x, y, type="line")

logistic邏輯回歸可以擬合因變量為1的概率,最終分類的時候,我們可以一個閾值,比如0.5,大於閾值的都分為正類,向量化公式如下:

還可以換一種方式理解logistic邏輯回歸,他是用多元線性函數去擬合因變量為正例與反例的比值的自然對數,推導如下:


Logistic邏輯回歸算法
- 假設自變量維度為N
- W為自變量的系數,下標0 - N
- X為自變量向量或矩陣,X維度為N,為了能和W0對應,X需要在第一行插入一個全是1的列。
- Y為因變量
- W為未知數待求解
最大似然估計法

梯度下降法迭代公式

R語言實現
使用iris數據集
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
將數據分為訓練數據和測試數據
R語言使用批量梯度下降法迭代求解
iris2 = rbind(subset(iris, Species=='setosa'), subset(iris, Species=='versicolor'))
X <- cbind(rep(1, nrow(iris2)), iris2$Sepal.Length, iris2$Sepal.Width, iris2$Petal.Length, iris2$Petal.Width)
Y <- as.numeric(iris2$Species) - 1
maxIterNum <- 2000;
step <- 0.05;
W <- rep(0, ncol(X))
m = nrow(X)
sigmoid <- function(z) { 1 / (1 + exp(-z))}
for (i in 1:maxIterNum){
grad <- t(X) %*% (sigmoid(X %*% W)-Y);
if (sqrt(as.numeric(t(grad) %*% grad)) < 1e-8){
print(sprintf('iter times=%d', i));
break;
}
W <- W - grad * step;
}
print(W);
hfunc <- function(a) {if (a > 0.5) return(1) else return (0);}
myY = apply(sigmoid(X %*% W), 1, hfunc)
print(cbind(Y, myY))
輸出后,可以看到擬合完全正確,因為本文只是為了推導一下邏輯回歸的算法,所以直接用全部數據擬合,沒有再抽出一部分做測試數據。
總結
- 應該增加一部分訓練數據,驗證模型的正確性
- 應該增加正則項避免過擬合,比如L2正則
更多精彩文章 http://h2cloud.org/
