逻辑斯蒂分布
设
是连续随机变量,
拥有下列分布函数和概率密度
式中,
为位置参数,
为形状参数。
二项逻辑回归模型
二项逻辑回归模型是一种分类模型,由条件概率分布
表示,形式为参数化的逻辑斯蒂分布,如下
这里,
是输入,
是输出,
和
是参数,
称为权值向量,
称为偏置,
为
和
的内积。
一个事件发生的几率是指该事件发生的概率与不发生概率的比值。对数几率就是在给几率加对数。
对逻辑回归而言,有下式
这就是说,在逻辑回归模型中,输出
的对数几率是输入
的线性函数。
模型参数估计
给定训练集
,其中,
,采用极大似然估计来确定模型参数。
进行统一形式,有
因此,似然函数为
取对数,化简之后得:
采用梯度下降法求
与
的最优值,对
求导。得到
假设最终求得的参数为
,则最终模型为:
下面展示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%!