逻辑回归(logistic regression)的原理以及python实现

逻辑斯蒂分布

X X 是连续随机变量, X X 拥有下列分布函数和概率密度
F ( X ) = P ( X x ) = 1 1 + e ( x μ ) / γ F(X)=P(X\leqslant x)=\frac{1}{1+e^{-(x-μ)/γ}}
f ( x ) = F ( x ) = e ( x μ ) / γ γ ( 1 + e ( x μ ) / γ ) 2 f(x)=F^{'}(x)=\frac{e^{-(x-μ)/γ}}{γ(1+e^{-(x-μ)/γ})^2}
式中, μ μ 为位置参数, γ > 0 γ>0 为形状参数。

二项逻辑回归模型

二项逻辑回归模型是一种分类模型,由条件概率分布 P ( Y X ) P(Y|X) 表示,形式为参数化的逻辑斯蒂分布,如下
P ( Y = 1 x ) = e w x + b 1 + e w x + b P(Y=1|x)=\frac{e^{w\cdot x+b}}{1+e^{w\cdot x+b}}
P ( Y = 0 x ) = 1 1 + e w x + b P(Y=0|x)=\frac{1}{1+e^{w\cdot x+b}}
这里, x R n x∈\textbf{R}^n 是输入, Y { 0 , 1 } Y∈\{0,1\} 是输出, w R n w∈\textbf{R}^n b R b∈\textbf{R} 是参数, w w 称为权值向量, b b 称为偏置, w x w\cdot x w w x x 的内积。
一个事件发生的几率是指该事件发生的概率与不发生概率的比值。对数几率就是在给几率加对数。
对逻辑回归而言,有下式
log P ( Y = 1 x ) 1 P ( Y = 1 x ) = w x \log\frac{P(Y=1|x)}{1-P(Y=1|x)}=w\cdot x
这就是说,在逻辑回归模型中,输出 Y = 1 Y=1 的对数几率是输入 x x 的线性函数。

模型参数估计

给定训练集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} ,其中, x i R n , y i { 0 , 1 } x_i∈\textbf{R}^n,y_i∈\{0,1\} ,采用极大似然估计来确定模型参数。
P ( Y = 1 x ) = e w x + b 1 + e w x + b P(Y=1|x)=\frac{e^{w\cdot x+b}}{1+e^{w\cdot x+b}}
P ( Y = 0 x ) = 1 1 + e w x + b P(Y=0|x)=\frac{1}{1+e^{w\cdot x+b}}
进行统一形式,有
P ( Y x ) = e w x + b 1 + e w x + b y i 1 1 + e w x + b 1 y i P(Y|x)=\frac{e^{w\cdot x+b}}{1+e^{w\cdot x+b}}^{y_i}\cdot \frac{1}{1+e^{w\cdot x+b}}^{1-y_i}
因此,似然函数为
i = 1 N ( e w x i + b 1 + e w x i + b ) y i ( 1 1 + e w x i + b ) 1 y i \prod_{i=1}^N(\frac{e^{w\cdot x_i+b}}{1+e^{w\cdot x_i+b}})^{y_i}\cdot (\frac{1}{1+e^{w\cdot x_i+b}})^{1-y_i}
取对数,化简之后得:
i = 1 N [ y i ( w x i + b ) log ( 1 + e w x i + b ) ] \sum_{i=1}^N[y_i(w\cdot x_i+b)-\log(1+e^{w\cdot x_i+b})]
采用梯度下降法求 w \textbf{w} b b 的最优值,对 w \textbf{w} 求导。得到
f ( w ) = i = 1 N x i ( y i e w x i + b 1 + e w x i + b ) f^{'}(w)=\sum_{i=1}^Nx_i\cdot (y_i-\frac{e^{w\cdot x_i+b}}{1+e^{w\cdot x_i+b}})
假设最终求得的参数为 w ^ \hat{w} ,则最终模型为:
P ( Y = 1 x ) = e x p ( w ^ x ) 1 + e x p ( w ^ x ) P(Y=1|x)=\frac{exp(\hat{w}\cdot x)}{1+exp(\hat{w}\cdot x)}
P ( Y = 0 x ) = 1 1 + e x p ( w ^ x ) P(Y=0|x)=\frac{1}{1+exp(\hat{w}\cdot x)}

下面展示python代码

import numpy as np
from sklearn.datasets import make_classification

class LogisticRegression:
    def __init__(self, x, y):
        b = np.ones((x.shape[0], 1))
        self.X = np.hstack((x, b))
        self.y = y
        self.w = np.random.rand(self.X.shape[1])

    def gradient(self, n):
        g = np.zeros(self.w.shape[0])
        for i in range(self.X.shape[0]):
            dotx = np.exp(np.dot(self.w, self.X[i]))
            t = dotx/(1+dotx)-y[i]
            t = t*self.X[i]
            g += t
        self.w -= n*g # 采用梯度下降法

    def cost(self):
        m = 0
        for i in range(self.X.shape[0]):
            m += -np.dot(self.w, self.X[i])*self.y[i] + np.log(1+np.exp(np.dot(self.w, self.X[i])))

    def score(self, X, y):
        s = 0
        t = np.ones((X.shape[0], 1))
        X = np.hstack((X, t))
        for i in range(X.shape[0]):
            P = np.exp(np.dot(self.w, X[i]))/(1+np.exp(np.dot(self.w, X[i])))
            if P >= 0.5 and y[i] == 1:
                s += 1
            elif P < 0.5 and y[i] == 0:
                s += 1
        print('分类器的精度为:{}'.format(s/X.shape[0]))



X, y = make_classification(n_samples=100, n_features=5) #随机生成100个样本

L = LogisticRegression(X, y)
for i in range(2000):
    L.gradient(0.05)
    L.cost()
L.score(X, y)


运行结果如下
在这里插入图片描述
分类器的精度达到了93%!

发布了5 篇原创文章 · 获赞 0 · 访问量 2100

猜你喜欢

转载自blog.csdn.net/qq_39320588/article/details/104098523
今日推荐