定义:设
是连续随机变量,
服从 logistic 分布是指
具有下列分布函数和密度函数:
式中
为位置参数,
为形状参数
分布函数
是一条S形曲线 sigmoid curve,曲线以点
为中心对称,即满足:
形状参数
的值越小,曲线在中心附近增长越快
binomial logistic regression model 是一种分类模型,由条件概率分布
表示, 形式为参数化的逻辑斯谛分布。这里,随机变量
的取值为实数,随机变量
取值为 1 或者 0。用监督学习的方法来估计模型参数。
二项逻辑斯谛回归模型具有下面条件概率分布:
是权值向量,
是偏置,
为
和
的内积(内积,对应位置相乘,再加总)
按照上面式子,可以求得
和
,LR模型将实例
分到概率较大的那一类。
事件的几率(odds)是指该事件发生的概率
比上 不发生的概率
,该事件的对数几率即
对于LR来讲,
,就是说,
的对数几率是输入
的线性函数
LR模型学习时,对于给定的训练数据集
, 其中,
, 应用极大似然估计,得到 LR 模型
假设:
似然函数为:
对数似然函数:
对
求极大值,得到
的估计值。
上面介绍的是两类分类LR模型,可以推广到多类分类。
假设离散随机变量
的取值集合是
, 那么多项LR模型是:
这里,
(把
合并写做
,所以
维变成
维)
sklearn.linear_model.LogisticRegression
# -*- coding:utf-8 -*-
# @Python Version: 3.7
# @Time: 2020/3/15 23:27
# @Author: Michael Ming
# @Website: https://michael.blog.csdn.net/
# @File: 6.LogisticRegression_MaxEntropy.py
# @Reference: https://github.com/fengdu78/lihang-code
from math import exp
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
def create_data():
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['label'] = iris.target
data = np.array(df.iloc[:100, [0, 1, -1]])
return data[:, :2], data[:, -1]
X, y = create_data()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
class LRclassifier():
def __init__(self, max_iter=200, learning_rate=0.01):
self.max_iter = max_iter
self.learning_rate = learning_rate
self.weights = None
def sigmoid(self, x):
return 1 / (1 + exp(-x))
def data_matrix(self, X):
data_mat = []
for d in X:
data_mat.append([1.0, *d]) # 数据加了一个截距项
return data_mat
def fit(self, X, y):
data_mat = self.data_matrix(X)
self.weights = np.zeros((len(data_mat[0]), 1), dtype=np.float32)
for iter_ in range(self.max_iter):
for i in range(len(X)):
result = self.sigmoid(np.dot(data_mat[i], self.weights)) # w x 内积
error = y[i] - result
self.weights += self.learning_rate * error * np.transpose([data_mat[i]])
# 学习算法,更新 w
print('LR Model(learning_rate={},max_iter={})'.format(self.learning_rate, self.max_iter))
def score(self, X_test, y_test):
right = 0
X_test = self.data_matrix(X_test)
for x, y in zip(X_test, y_test):
result = np.dot(x, self.weights)
if (result > 0 and y == 1) or (result < 0 and y == 0):
right += 1
return right / len(X_test)
def predict(self, X_test):
result = np.dot(self.data_matrix(X_test), self.weights)
if result > 0:
return 1
else:
return 0
lr_clf = LRclassifier()
lr_clf.fit(X_train, y_train)
print(lr_clf.score(X_test, y_test))
x_points = np.arange(4, 8)
y_ = -(lr_clf.weights[1] * x_points + lr_clf.weights[0]) / lr_clf.weights[2]
plt.plot(x_points, y_)
plt.scatter(X[:50, 0], X[:50, 1], label='0')
plt.scatter(X[50:, 0], X[50:, 1], label='1')
plt.legend()
plt.show()
# X_train, y_train = np.array([[3, 3, 3], [4, 3, 2], [2, 1, 2], [1, 1, 1], [-1, 0, 1], [2, -2, 1]]), np.array([1, 1, 1, 0, 0, 0])
# X_test = [[1, 2, -2]]
# lr_clf = LRclassifier()
# lr_clf.fit(X_train, y_train)
# print(lr_clf.predict(X_test))
# ---------sklearn--LR-----------------------
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(max_iter=200)
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))
print(clf.coef_, clf.intercept_)
x_ponits = np.arange(4, 8)
y_ = -(clf.coef_[0][0] * x_ponits + clf.intercept_) / clf.coef_[0][1]
plt.plot(x_ponits, y_)
plt.plot(X[:50, 0], X[:50, 1], 'bo', color='blue', label='0')
plt.plot(X[50:, 0], X[50:, 1], 'bo', color='orange', label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()
plt.show()
假设离散随机变量
的概率分布是
, 则其熵(熵介绍请点击)是:
变量的不确定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大。 信息熵是信息论中用于度量信息量的一个概念。一个系统越是有序,信息熵就越低; 反之,一个系统越是混乱,信息熵就越高。
熵满足不等式:
是
的取值个数,当且仅当
是 均匀分布 时右边等号成立;
均匀分布时(离散较大,混乱,不集中), 熵最大
最大熵原理认为,要选择的概率模型首先必须满足已有约束条件。在没有更多信息的情况下,那些不确定的部分都是“等可能的 ”。最大熵原理通过熵的最大化来表示等可能性。
表示输入
表示输出,
是输入、输出的集合
,以条件概率
输出
模型应满足的条件,根据训练集,可以确定联合分布
的经验分布
的经验分布
,
表示频数,
表示样本容量
特征函数
特征函数
关于经验分布
的期望值:
特征函数
关于模型
与经验分布
的期望值:
如果模型能够获取训练数据中的信息,那么就可以假设这两个期望值相等,即
将上式作为模型学习的约束条件。如果有
个特征函数
,就有
个约束条件。
最大熵模型(定义):
上的条件熵为:
中条件熵
最大的模型称为最大熵模型,对数为自然对数
学习过程就是约束最优化问题。
对于给定的训练数据集
,以及特征函数
,ME 模型的学习等价于约束最优化问题:
按照最优化的习惯,改为求最小值问题:
求解:
引进拉格朗日乘子
,定义拉格朗日函数
:
通过求解对偶问题求解原始问题。
最优化原始问题:
对偶问题:
先求对偶问题内部的极小化问题
,
是
的函数,记为:
, 称为对偶函数 对偶函数的解记为:
对
求偏导数:
令偏导数等于0,在
的情况下,有
由于
, 得
是规范化因子;
是特征函数;
是特征的权值。 红色部分就是最大熵模型,
是ME模型中的参数向量。
再求解对偶问题外部的极大化问题
其解记为
,
应用最优化算法求对偶函数
的极大化, 得到
, 用来表示
, 这里
是学习到的最优模型(最大熵模型)。
假设随机变量
有5个取值
,要估计各个值的概率
,其中
,求最大熵模型。
解:
用
表示
,最大熵模型学习的最优化问题是:
, 定义拉格朗日函数:
根据拉格朗日对偶性,可以通过求解对偶最优化问题得到原始最优化问题的解,所以求解:
关于
的极小化问题,求偏导:
于是:
关于
的极大化问题:
上式对
求偏导数并令其等于0,有:
于是求得概率分布:
常用的方法有 改进的迭代尺度法、梯度下降法、牛顿法或拟牛顿法。牛顿法或拟牛顿法一般收敛速度更快。 (略)