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

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

ztj100 2024-11-21 00:29 13 浏览 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)))

结果:

相关推荐

利用navicat将postgresql转为mysql

导航"拿来主义"吃得亏自己动手,丰衣足食...

Navicat的详细教程「偷偷收藏」(navicatlite)

Navicat是一套快速、可靠并价格适宜的数据库管理工具,适用于三种平台:Windows、macOS及Linux。可以用来对本机或远程的MySQL、SQLServer、SQLite、...

Linux系统安装SQL Server数据库(linux安装数据库命令)

一、官方说明...

Navicat推出免费数据库管理软件Premium Lite

IT之家6月26日消息,Navicat推出一款免费的数据库管理开发工具——NavicatPremiumLite,针对入门级用户,支持基础的数据库管理和协同合作功能。▲Navicat...

Docker安装部署Oracle/Sql Server

一、Docker安装Oracle12cOracle简介...

Docker安装MS SQL Server并使用Navicat远程连接

...

Web性能的计算方式与优化方案(二)

通过前面《...

网络入侵检测系统之Suricata(十四)——匹配流程

其实规则的匹配流程和加载流程是强相关的,你如何组织规则那么就会采用该种数据结构去匹配,例如你用radixtree组织海量ip规则,那么匹配的时候也是采用bittest确定前缀节点,然后逐一左右子树...

使用deepseek写一个图片转换代码(deepnode处理图片)

写一个photoshop代码,要求:可以将文件夹里面的图片都处理成CMYK模式。软件版本:photoshop2022,然后生成的代码如下://Photoshop2022CMYK批量转换专业版脚...

AI助力AUTOCAD,生成LSP插件(ai里面cad插件怎么使用)

以下是用AI生成的,用AUTOLISP语言编写的cad插件,分享给大家:一、将单线偏移为双线;;;;;;;;;;;;;;;;;;;;;;单线变双线...

Core Audio音频基础概述(core 音乐)

1、CoreAudioCoreAudio提供了数字音频服务为iOS与OSX,它提供了一系列框架去处理音频....

BlazorUI 组件库——反馈与弹层 (1)

组件是前端的基础。组件库也是前端框架的核心中的重点。组件库中有一个重要的板块:反馈与弹层!反馈与弹层在组件形态上,与Button、Input类等嵌入界面的组件有所不同,通常以层的形式出现。本篇文章...

怎样创建一个Xcode插件(xcode如何新建一个main.c)

译者:@yohunl译者注:原文使用的是xcode6.3.2,我翻译的时候,使用的是xcode7.2.1,经过验证,本部分中说的依然是有效的.在文中你可以学习到一系列的技能,非常值得一看.这些技能不单...

让SSL/TLS协议流行起来:深度解读SSL/TLS实现1

一前言SSL/TLS协议是网络安全通信的重要基石,本系列将简单介绍SSL/TLS协议,主要关注SSL/TLS协议的安全性,特别是SSL规范的正确实现。本系列的文章大体分为3个部分:SSL/TLS协...

社交软件开发6-客户端开发-ios端开发验证登陆部分

欢迎订阅我的头条号:一点热上一节说到,Android客户端的开发,主要是编写了,如何使用Androidstudio如何创建一个Android项目,已经使用gradle来加载第三方库,并且使用了异步...

取消回复欢迎 发表评论: