百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

统计学习方法逻辑斯蒂回归

ztj100 2024-11-21 00:29 16 浏览 0 评论

逻辑斯谛回归(logistic regression) 是统计学习中的经典分类方法。 最大熵是概率模型学习的一个准则, 将其推广到分类问题得到最大熵模型(maximum entropy model) 。逻辑斯谛回归模型与最大熵模型都属于对数线性模型。本文只介绍逻辑斯谛回归。

设X是连续随机变量, X服从Logistic distribution,
分布函数:


密度函数:


μ为位置参数, γ大于0为形状参数, (μ,1/2)中心对称


Sigmoid:


双曲正切函数(tanh):

二项逻辑斯蒂回归


Binomial logistic regression model由条件概率P(Y|X)表示的分类模型形式化为logistic distribution

X取实数, Y取值1,0

事件的几率odds: 事件发生与事件不发生的概率之比为

称为事件的发生比(the odds of experiencing an event),
对数几率:


对逻辑斯蒂回归:

似然函数

logistic分类器是由一组权值系数组成的, 最关键的问题就是如何获取这组权值, 通过极大似然函数估计获得, 并且

Y~f(x;w)

似然函数是统计模型中参数的函数。 给定输出x时, 关于参数θ的似然函数L(θ|x)(在数值上) 等于给定参数θ后变量X的概率: L(θ|x)=P(X=x|θ)

似然函数的重要性不是它的取值, 而是当参数变化时概率密度函数到底是变大还是变小。

极大似然函数: 似然函数取得最大值表示相应的参数能够使得统计模型最为合理。

那么对于上述m个观测事件, 设


其联合概率密度函数, 即似然函数为:


目标: 求出使这一似然函数的值最大的参数估, w1,w2,…,wn,使得L(w)取得 最大值。
对L(w)取对数。

对数似然函数


对L(w)求极大值, 得到w的估计值。
通常采用梯度下降法及
牛顿法, 学到的模型:

代码实验

实验中w的极大值采用梯度下降法,用的iris的数据集:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
 
class LogisticsRegression:
 
	def __init__(self):
		"""初始化Logistics Regression模型"""
		self.coef_ = None
		self.intercept_ = None
		self._theta = None
 
	def _sigmoid(self, t):
		return 1. / (1. + np.exp(-t))
 
	def accuracy_score(self, y_true, y_predict):
		"""计算y_true和y_predict之间的准确率"""
		assert len(y_true) == len(y_predict), \
			"the size of y_true must be equal to the size of y_predict"
 
		return np.sum(y_true == y_predict) / len(y_true)
 
	def fit(self, X_train, y_train, eta=0.01, n_iters=1e4):
		"""根据训练数据集X_train, y_train, 使用梯度下降法训练Logistics Regression模型"""
		assert X_train.shape[0] == y_train.shape[0], \
			"the size of X_train must be equal to the size of y_train"
 
		def J(theta, X_b, y):
			'''
			损失函数
			'''
			y_hat = self._sigmoid(X_b.dot(theta))
			try:
				return np.sum(y*np.log(y_hat) + (1-y)*np.log(1 - y_hat)) / len(y)
			except:
				return float('inf')
 
		def dJ(theta, X_b, y):
			'''
			求梯度
			'''
			return X_b.T.dot(self._sigmoid(X_b.dot(theta))  - y) / len(X_b)
 
		def gradient_descent(X_b, y, initial_theta, eta, n_iters=1e4, epsilon=1e-8):
			'''
			梯度下降
			'''
			theta = initial_theta
			cur_iter = 0
			while cur_iter < n_iters:
				gradient = dJ(theta, X_b, y)
				last_theta = theta
				theta = theta - eta * gradient
				if (abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon):
					break
				cur_iter += 1
			return theta
 
		X_b = np.hstack([np.ones((len(X_train), 1)), X_train])
		initial_theta = np.zeros(X_b.shape[1])
		self._theta = gradient_descent(X_b, y_train, initial_theta, eta, n_iters)
 
		self.intercept_ = self._theta[0]
		self.coef_ = self._theta[1:]
 
		return self
 
	def predict_proba(self, X_predict):
		"""给定待预测数据集X_predict,返回表示X_predict的结果概率向量"""
		assert self.intercept_ is not None and self.coef_ is not None, \
			"must fit before predict!"
		assert X_predict.shape[1] == len(self.coef_), \
			"the feature number of X_predict must be equal to X_train"
 
		X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict])
		return self._sigmoid(X_b.dot(self._theta))
	
	def predict(self, X_predict):
		"""给定待预测数据集X_predict,返回表示X_predict的结果向量"""
		assert self.intercept_ is not None and self.coef_ is not None, \
			"must fit before predict!"
		assert X_predict.shape[1] == len(self.coef_), \
			"the feature number of X_predict must be equal to X_train"
		proba = self.predict_proba(X_predict)
		return np.array(proba>=0.5, dtype = 'int')
 
	def score(self, X_test, y_test):
		"""根据测试数据集 X_test 和 y_test 确定当前模型的准确度"""
 
		y_predict = self.predict(X_test)
		return self.accuracy_score(y_test, y_predict)
 
	def __repr__(self):
		return "LogisticsRegression()"
 
iris = load_iris()
 
X = iris.data
y = iris.target
 
# 二项LogisticsRegression只适用二分类
X = X[y<2, :2]
y = y[y<2]
 
# # 画出数据
# plt.scatter(X[y == 0, 0], X[y == 0, 1], color="red")
# plt.scatter(X[y == 1, 0], X[y == 1, 1], color="blue")
# plt.show()
 
def train_test_split(X, y, test_ratio=0.2, seed=None):
	"""将数据 X 和 y 按照test_ratio分割成X_train, X_test, y_train, y_test"""
	assert X.shape[0] == y.shape[0], \
		"the size of X must be equal to the size of y"
	assert 0.0 <= test_ratio <= 1.0, \
		"test_ration must be valid"
 
	if seed:
		np.random.seed(seed)
 
	shuffled_indexes = np.random.permutation(len(X))
 
	test_size = int(len(X) * test_ratio)
	test_indexes = shuffled_indexes[:test_size]
	train_indexes = shuffled_indexes[test_size:]
 
	X_train = X[train_indexes]
	y_train = y[train_indexes]
 
	X_test = X[test_indexes]
	y_test = y[test_indexes]
 
	return X_train, X_test, y_train, y_test
 
X_train, X_test, y_train, y_test = train_test_split(X, y, seed = 888)
log_reg = LogisticsRegression()
log_reg.fit(X_train, y_train)
print('测试集预测准确率:'+ str(log_reg.score(X_test, y_test)))
print('测试集合预测概率:'+ str(log_reg.predict_proba(X_test)))
print('测试集合标签:'+ str(y_test))
print('测试集合预测标签:' + str(log_reg.predict(X_test)))

结果:

相关推荐

30天学会Python编程:16. Python常用标准库使用教程

16.1collections模块16.1.1高级数据结构16.1.2示例...

强烈推荐!Python 这个宝藏库 re 正则匹配

Python的re模块(RegularExpression正则表达式)提供各种正则表达式的匹配操作。...

Python爬虫中正则表达式的用法,只讲如何应用,不讲原理

Python爬虫:正则的用法(非原理)。大家好,这节课给大家讲正则的实际用法,不讲原理,通俗易懂的讲如何用正则抓取内容。·导入re库,这里是需要从html这段字符串中提取出中间的那几个文字。实例一个对...

Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)

实现功能:Python数据分析实战-利用正则表达式提取文本中的URL网址和邮箱...

python爬虫教程之爬取当当网 Top 500 本五星好评书籍

我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...

深入理解re模块:Python中的正则表达式神器解析

在Python中,"re"是一个强大的模块,用于处理正则表达式(regularexpressions)。正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换或提取特定模式...

如何使用正则表达式和 Python 匹配不以模式开头的字符串

需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...

先Mark后用!8分钟读懂 Python 性能优化

从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...

Python“三步”即可爬取,毋庸置疑

声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...

简单学Python——re库(正则表达式)2(split、findall、和sub)

1、split():分割字符串,返回列表语法:re.split('分隔符','目标字符串')例如:importrere.split(',','...

Lavazza拉瓦萨再度牵手上海大师赛

阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。Lavazza拉瓦萨再度牵手上海大师赛标题:2024上海大师赛:网球与咖啡的浪漫邂逅在2024年的上海劳力士大师赛上,拉瓦萨咖啡再次成为官...

ArkUI-X构建Android平台AAR及使用

本教程主要讲述如何利用ArkUI-XSDK完成AndroidAAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:1.跨平台Library工程开发介绍...

Deepseek写歌详细教程(怎样用deepseek写歌功能)

以下为结合DeepSeek及相关工具实现AI写歌的详细教程,涵盖作词、作曲、演唱全流程:一、核心流程三步法1.AI生成歌词-打开DeepSeek(网页/APP/API),使用结构化提示词生成歌词:...

“AI说唱解说影视”走红,“零基础入行”靠谱吗?本报记者实测

“手里翻找冻鱼,精心的布局;老漠却不言语,脸上带笑意……”《狂飙》剧情被写成歌词,再配上“科目三”背景音乐的演唱,这段1分钟30秒的视频受到了无数网友的点赞。最近一段时间随着AI技术的发展,说唱解说影...

AI音乐制作神器揭秘!3款工具让你秒变高手

在音乐创作的领域里,每个人都有一颗想要成为大师的心。但是面对复杂的乐理知识和繁复的制作过程,许多人的热情被一点点消磨。...

取消回复欢迎 发表评论: