logistic回归

简介:


回归就是对已知公式的未知参数进行估计。比如已知公式是 y = a x + b ,未知参数是a和b,利用多真实的(x,y)训练数据对a和b的取值去自动估计。估计的方法是在给定训练样本点和已知的公式后,对于一个或多个未知参数,机器会自动枚举参数的所有可能取值,直到找到那个最符合样本点分布的参数(或参数组合)。

##logistic分布

设X是连续随机变量,X服从logistic分布是指X具有下列分布函数和密度函数:

F ( x ) = P ( x x ) = 1 1 + e ( x μ ) / γ   f ( x ) = F ( x ) = e ( x μ ) / γ γ ( 1 + e ( x μ ) / γ ) 2

其中, μ 为位置参数, γ 为形状参数。

f ( x ) 与$F(x)图像如下,其中分布函数是以(\mu, \frac 1 2)为中心对阵,\gamma$越小曲线变化越快。

logistic分布的密度函数和分布函数

##logistic回归模型

二项logistic回归模型如下:

P ( Y = 1 | x ) = e x p ( w x + b ) 1 + e x p ( w x + b )   P ( Y = 0 | x ) = 1 1 + e x p ( w x + b )

其中, x R n 是输入, Y 0 , 1 是输出,w称为权值向量,b称为偏置, w x 为w和x的内积。

###参数估计

假设:

P(Y=1|x)=\pi (x), \quad P(Y=0|x)=1-\pi (x)

则似然函数为:

$$\prod_{i=1}N [\pi (x_i)]{y_i} [1 - \pi(x_i)]^{1-y_i}

求对数似然函数:
L ( w ) = _ i = 1 N [ y _ i log π ( x _ i ) + ( 1 y _ i ) log ( 1 π ( x _ i ) ) ]   = _ i = 1 N [ y _ i log π ( x _ i ) 1 π ( x _ i ) + log ( 1 π ( x _ i ) ) ]
从而对 L ( w ) 求极大值,得到 w 的估计值。 求极值的方法可以是梯度下降法,梯度上升法等。 ##梯度上升确定回归系数 logistic回归的sigmoid函数:
σ ( z ) = 1 1 + e z
假设logstic的函数为:
y = w _ 0 + w _ 1 x _ 1 + w _ 2 x _ 2 + . . . + w _ n x _ n
可简写为:
y = w _ 0 + w T x
梯度上升算法是按照上升最快的方向不断移动,每次都增加 α _ w f ( w )
w = w + α _ w f ( w )
其中, _ w f ( w ) 为函数导数, α 为增长的步长。 ###训练算法 本算法的主要思想根据logistic回归的sigmoid函数来将函数值映射到有限的空间内,sigmoid函数的取值范围是0~1,从而可以把数据按照0和1分为两类。在算法中,首先要初始化所有的w权值为1,每次计算一次误差并根据误差调整w权值的大小。 * 每个回归系数都初始化为1 * 重复N次 * 计算整个数据集合的梯度 * 使用 α f ( x ) 来更新w向量 * 返回回归系数 ```python #!/usr/bin/env python # encoding:utf-8 import math import numpy import time import matplotlib.pyplot as plt def sigmoid(x): return 1.0 / (1 + numpy.exp(-x)) def loadData(): dataMat = [] laberMat = [] with open("test.txt", 'r') as f: for line in f.readlines(): arry = line.strip().split() dataMat.append([1.0, float(arry[0]), float(arry[1])]) laberMat.append(float(arry[2])) return numpy.mat(dataMat), numpy.mat(laberMat).transpose() def gradAscent(dataMat, laberMat, alpha=0.001, maxCycle=500): """general gradscent""" start_time = time.time() m, n = numpy.shape(dataMat) weights = numpy.ones((n, 1)) for i in range(maxCycle): h = sigmoid(dataMat * weights) error = laberMat - h weights += alpha * dataMat.transpose() * error duration = time.time() - start_time print "duration of time:", duration return weights def stocGradAscent(dataMat, laberMat, alpha=0.01): start_time = time.time() m, n = numpy.shape(dataMat) weights = numpy.ones((n, 1)) for i in range(m): h = sigmoid(dataMat[i] * weights) error = laberMat[i] - h weights += alpha * dataMat[i].transpose() * error duration = time.time() - start_time print "duration of time:", duration return weights def betterStocGradAscent(dataMat, laberMat, alpha=0.01, numIter=150): """better one, use a dynamic alpha""" start_time = time.time() m, n = numpy.shape(dataMat) weights = numpy.ones((n, 1)) for j in range(numIter): for i in range(m): alpha = 4 / (1 + j + i) + 0.01 h = sigmoid(dataMat[i] * weights) error = laberMat[i] - h weights += alpha * dataMat[i].transpose() * error duration = time.time() - start_time print "duration of time:", duration return weights start_time = time.time() def show(dataMat, laberMat, weights): m, n = numpy.shape(dataMat) min_x = min(dataMat[:, 1])[0, 0] max_x = max(dataMat[:, 1])[0, 0] xcoord1 = []; ycoord1 = [] xcoord2 = []; ycoord2 = [] for i in range(m): if int(laberMat[i, 0]) == 0: xcoord1.append(dataMat[i, 1]); ycoord1.append(dataMat[i, 2]) elif int(laberMat[i, 0]) == 1: xcoord2.append(dataMat[i, 1]); ycoord2.append(dataMat[i, 2]) fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(xcoord1, ycoord1, s=30, c="red", marker="s") ax.scatter(xcoord2, ycoord2, s=30, c="green") x = numpy.arange(min_x, max_x, 0.1) y = (-weights[0] - weights[1]*x) / weights[2] ax.plot(x, y) plt.xlabel("x1"); plt.ylabel("x2") plt.show() if __name__ == "__main__": dataMat, laberMat = loadData() #weights = gradAscent(dataMat, laberMat, maxCycle=500) #weights = stocGradAscent(dataMat, laberMat) weights = betterStocGradAscent(dataMat, laberMat, numIter=80) show(dataMat, laberMat, weights) ``` 未优化的程序结果如下, ![普通结果](http://ww4.sinaimg.cn/mw690/6d96cc41gw1etfkp7c19oj20pi0hudh5.jpg) 随机梯度上升算法(降低了迭代的次数,算法较快,但结果不够准确)结果如下, ![随机梯度上升算法结果](http://ww1.sinaimg.cn/mw690/6d96cc41gw1etfkp4rvquj20pi0hu0u5.jpg) 对 α 进行优化,动态调整步长(同样降低了迭代次数,但是由于代码采用动态调整alpha,提高了结果的准确性),结果如下 ![alpha优化结果](http://ww1.sinaimg.cn/mw690/6d96cc41gw1etfkp1vs2hj20m80goaba.jpg)

本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/p/4598913.html,如需转载请自行联系原作者
相关文章
|
6月前
|
存储 JSON 关系型数据库
【亲测有用】数据中台数据集成管理能力演示
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
【亲测有用】数据中台数据集成管理能力演示
|
2月前
|
数据安全/隐私保护 Python
淘宝购买记录生成器,淘宝订单生成器在线制作,淘宝购买截图生成【python】
这段代码展示了如何使用Python生成模拟的淘宝订单数据,包括订单ID、购买时间、买家信息
|
2月前
|
机器学习/深度学习 传感器 文字识别
传统OCR与深度学习OCR的较量
OCR(光学字符识别)技术经历了从传统手工特征提取到深度学习自动化处理的变革。本文对比传统OCR与深度学习OCR,从图像预处理到后处理,详解技术演进带来的速度、精度与扩展性飞跃。
107 0
|
7月前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【Neck】| NeurIPS 2023 融合GOLD-YOLO颈部结构,强化小目标检测能力
RT-DETR改进策略【Neck】| NeurIPS 2023 融合GOLD-YOLO颈部结构,强化小目标检测能力
147 17
RT-DETR改进策略【Neck】| NeurIPS 2023 融合GOLD-YOLO颈部结构,强化小目标检测能力
|
7月前
|
人工智能 搜索推荐 安全
正式上线!阿里云短信模板 AI 助手,10 秒生成/改写个性化、合规短信内容
阿里云短信服务 - 短信模板AI 助手已全面开放,欢迎体验!
414 6
|
8月前
|
机器学习/深度学习 自然语言处理 量子技术
《攻克新兴领域实体识别难题,NER技术突围之路》
命名实体识别(NER)是自然语言处理的基础任务,旨在从文本中识别特定实体。传统NER在常见领域表现良好,但在新兴领域如元宇宙、量子计算等面临挑战,主要因新术语频出且缺乏标注数据。为提升新兴领域的NER识别率,研究者探索了数据增强、迁移学习、多模态融合及领域自适应等方法,以应对数据匮乏、专业性强等问题,推动NER技术在前沿领域的应用与发展。
186 3
|
9月前
|
敏捷开发 持续交付 项目管理
敏捷开发下如何选择高效的协同工具?提升研发团队项目管理与沟通效率的建议
本文介绍了6款适用于软件研发团队的协同工具,包括板栗看板、Jira、Trello、Slack、GitLab和Asana,涵盖了任务管理、版本控制、文档协作等方面。每款工具都有其独特的优势和适用场景,如板栗看板适合敏捷开发的小型团队,Jira适用于大型项目的复杂管理,Trello以简洁易用著称,Slack强化团队沟通,GitLab支持CI/CD流程,Asana则擅长跨团队协作。选择合适的工具能有效提升团队效率和项目管理能力。
敏捷开发下如何选择高效的协同工具?提升研发团队项目管理与沟通效率的建议
2024年 | 12月云大使推广奖励规则
【近期云大使规则升级】①上线企业云大使提现功能。②增加返利订单类目。③优化推广奖励限制。④提升首购后订单返利比例。⑤新增沉睡用户返利 。⑥推荐企业认证新用户首购最高奖励45%。
|
canal 搜索推荐 关系型数据库
学成在线笔记+踩坑(10)——课程搜索、课程发布时同步索引库。
课程搜索、使用XXL-JOB实现课程发布时同步ES索引库
学成在线笔记+踩坑(10)——课程搜索、课程发布时同步索引库。
|
机器学习/深度学习 Python
时间序列特征提取:从理论到Python代码实践
时间序列是一种特殊的存在。这意味着你对表格数据或图像进行的许多转换/操作/处理技术对于时间序列来说可能根本不起作用。
303 1
时间序列特征提取:从理论到Python代码实践

热门文章

最新文章