机器学习:逻辑回归

news2024/11/24 22:37:29

概念

首先,逻辑回归属于分类算法,是线性分类器。我们可以认为逻辑回归是在多元线性回归的基础上把结果给映射到0-1的区间内,hθ(x)越接近1越有可能是正例,反之,越接近0越有可能是负例。那么,我们该通过什么函数把结果映射到0-1之间呢?

Sigmoid函数

sigmoid(x) = \frac{1}{1+e^{-x}}

在这里,我们实际上是把y\hat{}作为变量传入,得到

sigmoid(\theta .TX) = \frac{1}{1+e^{-\theta .TX}}

import numpy as np
import math
import matplotlib.pyplot as plt

def sigmoid(x):
    a =[]
    for item in  x:
        a.append(1.0/(1.0+math.exp(-item)))
    return a

x = np.arange(-15,15,0.1)
y = sigmoid(x)

plt.plot(x,y)
plt.show()

 

这里我设定的自变量范围为[-15,15],但实际上sigmoid函数定义域为[-inf,+inf]。当自变量为0时,函数值为0.5。

分类器的任务就是找到一个边界,这个边界可以尽可能地划分我们的数据集。当我们把0.5作为边界时,我们要找的就是y\hat{} = \frac{1}{1+e^{-\theta .TX}} = 0.5的解,即θ.TX = 0时θ的值。

广义线性回归

伯努利分布

如果随机变量只能取0和1两个值,则称其服从伯努利分布。

记作f(x|p) = \left\{\begin{matrix} p^{x}q^{1-x} (x=0,1)\\ 0(x\neq 0,1) \end{matrix}\right.

p为正例概率,即当x=1时的概率。但是我们发现这样的分段函数比较难求它的损失函数。为了将分段函数整合,我们先引入广义线性回归的概念。

广义线性回归

当考虑一个分类或者回归问题时,我们就是想预测某个随机变量y,y是某些特征x的函数。为了推广广义线性模式,我们做出三个假设。

一,P(y|(x,θ)) 服从指数族分布。

二,给定x,我们的目的是为了预测T(y)在条件x下的期望,一般情况T(y) = y,这就意味着我们希望预测h(x) = E(y|x)。 

三,参数η和输入x是线性相关的,η=θ.TX

 指数族分布(The Exponential Family Distribution)

指数族分布有:高斯分布,二项分布,伯努利分布,多项分布,泊松分布,指数分布,beta分布,拉普拉斯分布,γ分布。对于回归来说,如果y服从某个指数分布,那么就可以用广义线性回归来建立模型。

通式为

P(y,\eta ) = b(y)*e^{\eta ^{T}T(y)-a(\eta )}

或者

P(y,\eta ) = b(y)*exp(\eta ^{T}T(y)-a(\eta ))

η:自然参数,在线性回归中 \eta = \theta ^{T}x

T(y):充分统计量,一般情况下为y

a(η):对数部分函数,这部分确保分布积分结果为1。

伯努利分布其实也是指数族分布的一种,推导证明:

P(y,\phi ) = \phi ^{y}(1-\phi )^{1-y} 在这里,我们成功地将分段函数整合在一个等式中,方便求解后面的损失函数。

φ:正例概率。

y:1或0,正例或负例。

=exp(ylog\phi +(1-y)log(1-\phi ))

= exp((log(\frac{\phi }{1-\phi }))y + log(1-\phi ))

对比P(y,\eta ) = b(y)*exp(\eta ^{T}T(y)-a(\eta ))

由此可知,\eta = \theta ^{T}x = log(\frac{p}{1-p})

P = \frac{1}{1+e^{-\theta ^{Tx}}}

我们发现,这与sigmoid函数推导出来的结果是一致的,这便是逻辑回归使用sigmoid函数的原因。

损失函数推导

我们使用最大似然估计(MLE),根据若干已知的X,y找到一组w使得X作为已知条件下y发生的概率最大。

sigmoid(w,x)输出的含义为P(y=1|w,x),即在w,x条件下正例概率,那么负例概率P(y=0|w,x) = 1-sigmoid(w,x)。

只要让我们的sigmoid(w,x)函数在训练集上预测概率最大,sigmoid(w,x)就是最好的解。

P(true) = \left\{\begin{matrix} sigmoid(w,xi) (yi = 1)\\1-sigmoid(w,xi)(yi=0) \end{matrix}\right.

分段函数显然不符合我们的要求,我们将其变形为

P(true) = sigmoid(w,xi)^{yi}*(1-sigmoid(w,xi))^{(1-yi)}

y\hat{} = sigmoid(\theta ^{T}x) = h\theta (x)

P(y|x,\theta ) = (h\theta (x))^{y}(1-h\theta (x))^{1-y}

我们假设训练样本相互独立,那么似然函数

L(\theta ) = P(y\vec{}|X,\theta )

= \prod_{i=1}^{m}P(yi|xi,\theta )

= \prod_{i=1}^{m} (h\theta (xi))^{yi}(1-h\theta (xi))^{1-yi}

自然而然,我们两边取对数

l(\theta ) = lnL(\theta )

=\sum_{i=1}^{m}yiln(h\theta (xi))+(1-yi)ln(1-h\theta (xi))

这里我们发现,整个过程和线性回归十分相似,首先构造似然函数,再用最大似然估计,最后得到θ更新迭代的等式,只不过这里不是梯度下降,而是梯度上升,习惯上,我们使用梯度下降。

所以损失函数为

J(\theta ) = -\sum_{i=1}^{m}yiln(h\theta (xi))+(1-yi)ln(1-h\theta (xi))

梯度下降

\theta ^{t+1}j = \theta ^{t}j - \alpha \frac{\partial J(\theta )}{\partial \theta }

sigmoid{}'(x) = sigmoid(x)(1-sigmoid(x))

\frac{\partial J(\theta )}{\partial \theta } = -\frac{1}{m}\sum_{i=1}^{m}(yi\frac{1}{h\theta (xi)}\frac{\partial h\theta (xi)}{\partial \theta j} - (1-yi)\frac{1}{1-h\theta (xi)}\frac{\partial h\theta (xi)}{\partial \theta j})

= -\frac{1}{m}\sum_{i=1}^{m}(yi\frac{1}{sigmoid(\theta ^{T}x)}-(1-yi)\frac{1}{1-sigmoid(\theta ^{T}x)})\cdot \frac{\partial sigmoid(\theta ^{T}x)}{\partial \theta j}

= -\frac{1}{m}\sum_{i=1}^{m}(yi\frac{1}{sigmoid(\theta ^{T}x)}-(1-yi)\frac{1}{1-sigmoid(\theta ^{T}x)})\cdot sigmoid(\theta ^{T}x)\cdot (1-sigmoid(\theta ^{T}x))\cdot \frac{\partial \theta ^{T}x}{\partial \theta j}

= -\frac{1}{m}\sum_{i=1}^{m}(yi-sigmoid(\theta ^{T}x))\cdot Xj

= \frac{1}{m}\sum_{i=1}^{m}(h\theta (xi)-yi)\cdot Xj

我们发现,最终的梯度公式与线性回归很相似,这是因为它们都是广义线性回归中来的,服从的都是指数族分布。

代码实现

from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import scale
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

data = load_breast_cancer()
X,y = data['data'][:,:2],data['target']
lr = LogisticRegression(fit_intercept=False)
lr.fit(X,y)
w1 = lr.coef_[0,0]
w2 = lr.coef_[0,1]

def p_theta_function(features,w1,w2):
    z = w1*features[0] + w2*features[1]
    return 1/(1+np.exp(-z))

def loss_function(samples_features,samples_labels,w1,w2):
    result = 0
    for features,label in zip(samples_features,samples_labels):
        p_result = p_theta_function(features,w1,w2)
        loss_result = -1*label*np.log(p_result) - (1-label)*np.log(1-p_result)
        result += loss_result
    return result


w1_space = np.linspace(w1-0.6,w1+0.6,50)
w2_space = np.linspace(w2-0.6,w2+0.6,50)

result1_ = np.array([loss_function(X,y,i,w2)for i in w1_space])
result2_ = np.array([loss_function(X,y,w1,i)for i in w2_space])

fig = plt.figure(figsize=(8,6))
plt.subplot(2,2,1)
plt.plot(w1_space,result1_)
plt.subplot(2,2,2)
plt.plot(w2_space,result2_)

w1_grid,w2_grid = np.meshgrid(w1_space,w2_space)
loss_grid = loss_function(X,y,w1_grid,w2_grid)
plt.subplot(2,2,3)
plt.contour(w1_grid,w2_grid,loss_grid)
plt.subplot(2,2,4)
plt.contour(w1_grid,w2_grid,loss_grid,30)
fig_2 = plt.figure()
ax = fig_2.add_axes(Axes3D(fig_2))
ax.plot_surface(w1_grid, w2_grid, loss_grid, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))
ax.contourf(w1_grid, w2_grid, loss_grid,zdir='z', offset=-2, cmap=plt.get_cmap('rainbow'))
print("θ1 = ",w1)
print("θ2 = ",w2)

plt.show()

 

观察图像,我们发现w1,w2两个维度不均匀,等高线组成的是椭圆,在这里,我们使用正则化稍微约束一下。

from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import scale
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
data = load_breast_cancer()
X,y = scale(data['data'][:,:2]),data['target']
lr = LogisticRegression(fit_intercept=False)
lr.fit(X,y)
w1 = lr.coef_[0,0]
w2 = lr.coef_[0,1]

def p_theta_function(features,w1,w2):
    z = w1*features[0] + w2*features[1]
    return 1/(1+np.exp(-z))

def loss_function(samples_features,samples_labels,w1,w2):
    result = 0
    for features,label in zip(samples_features,samples_labels):
        p_result = p_theta_function(features,w1,w2)
        loss_result = -1*label*np.log(p_result) - (1-label)*np.log(1-p_result)
        result += loss_result
    return result


w1_space = np.linspace(w1-0.6,w1+0.6,50)
w2_space = np.linspace(w2-0.6,w2+0.6,50)

result1_ = np.array([loss_function(X,y,i,w2)for i in w1_space])
result2_ = np.array([loss_function(X,y,w1,i)for i in w2_space])

fig = plt.figure(figsize=(8,6))
plt.subplot(2,2,1)
plt.plot(w1_space,result1_)
plt.subplot(2,2,2)
plt.plot(w2_space,result2_)

w1_grid,w2_grid = np.meshgrid(w1_space,w2_space)
loss_grid = loss_function(X,y,w1_grid,w2_grid)
plt.subplot(2,2,3)
plt.contour(w1_grid,w2_grid,loss_grid)
plt.subplot(2,2,4)
plt.contour(w1_grid,w2_grid,loss_grid,30)
fig_2 = plt.figure()
ax = fig_2.add_axes(Axes3D(fig_2))
ax.plot_surface(w1_grid, w2_grid, loss_grid, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))
ax.contourf(w1_grid, w2_grid, loss_grid,zdir='z', offset=-2, cmap=plt.get_cmap('rainbow'))
print("θ1 = ",w1)
print("θ2 = ",w2)

plt.show()

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1633974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++中list的使用

文章目录 一、 list简介二、 构造函数1. 默认构造函数2. 拷贝构造3. 迭代器区间初始化4. 插入n个值为x的数据5. 代码示例 三、 容量和元素访问1. empty()2. size()3. max_size()3. back()4. front()5. 代码示例 四、 增删查改1. push_back()2. push_front()3. emplace_back()4.…

stm32f103zet6_串口实现-DHT11-tim1(定时)

1思路 1打开时钟 1.1使用定时器实现us级的计时 1.2在打开串口 1,3在DHT11驱动中修改引脚 stm32cudeMX 配置 1打开时钟 2打开串口 3打开tim1(定时器) 4生成代码 代码设置 1导入DHT11库(tim.h是定时器的文件系统自动生成的) DHT11.c #include "dht11.h" #inc…

机器学习:基于Sklearn、XGBoost框架,使用逻辑回归、支持向量机和XGBClassifier来诊断并预测一个人是否患有自闭症

前言 系列专栏:机器学习:高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学…

nuxt3使用记录五:禁用莫名其妙的Tailwind CSS(html文件大大减小)

发现这个问题是因为,今天我突然很好奇,我发现之前构建的自动产生的200.html和404.html足足290k,怎么这么大呢?不是很占用我带宽? 一个啥东西都没有的静态页面,凭啥这么大!所以我就想着手动把他…

爬虫实战-房天下(bengbu.zu.fang.com/)数据爬取

详细代码链接https://flowus.cn/hbzx/3c42674d-8e6f-42e3-a3f6-bc1258034676 import requests from lxml import etree #xpath解析库 def 源代码(url): cookies { global_cookie: xeqnmumh38dvpj96uzseftwdr20lvkwkfb9, otherid: b44a1837638234f1a0a15e…

Android Studio的笔记--布局文件

关于Layout布局文件的使用 LinearLayoutRelativeLayout之前文章的内容一些常见性质在android.graphics.Color中定义了12种常见的颜色常数线性布局LinearLayout 一些常见使用文本框TextView设置文本内容编辑框EditText获取文本内容按钮Button控件使用其他按钮修改图标及名称添加…

HEVC/H.265视频编解码学习笔记–框架及块划分关系

前言 由于本人在学习视频的过程中,觉得分块单元太多搞不清楚其关系,因此本文着重记录这些分块单元的概念以及关联。 一、框架 视频为一帧一帧的图像,其编码的主要核心是压缩空间以及时间上的冗余。因此,视频编码有帧内预测和帧间…

C语言函数指针的使用、函数指针数组及使用、指向函数指针数组的指针,指针进阶版的冒泡排序等介绍

文章目录 前言一、函数指针的使用1. 加减乘除计算器普通实现2. 加减乘除计算机函数指针实现 二、函数指针数组1. 函数指针数组的书写2. 两个有趣的代码3. 函数指针数组的使用 三、指向函数指针数组的指针四、指针进阶_冒泡排序1.整型冒泡排序2. C语言qsort函数3. 仿写C语言qsor…

第十二章 案例二:配置Trunk,实现相同VLAN的跨交换机通信

1、实验环境 公司的员工人数已达到 100 人,其网络设备如图12.13所示,现在的网络环境导致广播较多网速慢,并且也不安全,公司希望按照部门划分网络,并且能够保证一定的网络安全性 图12.13 实验案例二拓扑图 其网络规划…

【AIGC调研系列】来认识一下:WebLlama

WebLlama是一个基于Meta Llama 3构建的代理,专门为了网页导航和对话进行了微调。它是由McGill University的自然语言处理团队开发的研究项目,旨在通过对话进行网页浏览的智能代理[1][2]。WebLlama的目标是构建有效的人为中心的代理,帮助用户浏…

格雷希尔E10系列大电流测试连接器,在新能源汽车大电流接插件的电气测试方案

在新能源汽车的电驱动、电池包等设备的电测试处理中,格雷希尔E10系列电测试连接器具有显著的优势。E10系列的核心设计——插孔/插针,可以达到实验室10万次的插拔寿命,相比传统公母电接头500次左右的连接寿命,E10系列无疑大大减少测…

PCL 梯度滤波

文章目录 一、简介一、简介二、实现代码三、实现效果参考资料一、简介 一、简介 点云梯度滤波是指基于每个点与邻近点之间的倾斜程度进行滤波的算法,其原理也很简单,如下图所示: CloudCompare中的做法是: d i r = A B

网盘——删除常规文件

本文主要讲解网盘中文件操作部分的删除常规文件部分,具体实施步骤如下: 目录 1、具体步骤: 2、代码实现 2.1、添加删除常规文件的协议 2.2、添加删除常规文件槽函数 2.3、关联槽函数 2.4、添加槽函数定义 2.5、服务器回复 2.6、客户…

推荐一个wordpress免费模板下载

首页大背景图,首屏2张轮播图,轮换展示,效果非常的炫酷,非常的哇噻,使用这个主题搭建的wordpress网站,超过了200个,虽然是一个老主题了,不过是经得起时间考验的,现在用起来…

06|LangChain | 从入门到实战 -六大组件之Agent

点点赞~ 注意:langchain的版本迭代比较快,社区维护,代码当中或许部分方法在某个版本不再支持 01|LangChain | 从入门到实战-介绍 02|LangChain | 从入门到实战 -六大组件之Models IO 03|LangChain | 从入…

《R语言与农业数据统计分析及建模》——多重共线性和逐步回归

一、多重共线性 多重共线性:在多元线性回归时,多个自变量之间存在高度相关关系,时模型估计失真或难以估计准确的情况。 一般地,多元线性回归中自变量间应尽量相互独立。常规模型诊断方法难以检测多重共线性。 1、案例解释 作物产…

嵌入式学习65-C++(继承.派生和QT布局管理)

知识零碎: 信号合槽: 对象间通信 …

《动手学深度学习(Pytorch版)》Task03:线性神经网络——4.29打卡

《动手学深度学习(Pytorch版)》Task03:线性神经网络 线性回归基本元素线性模型损失函数随机梯度下降 正态分布与平方损失 线性回归的从零开始实现读取数据集初始化模型参数定义模型定义损失函数定义优化算法训练 线性回归的简洁实现读取数据集…

Find My无人机|苹果Find My技术与无人机结合,智能防丢,全球定位

无人机是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞机,或者由车载计算机完全地或间歇地自主地操作。无人机按应用领域,可分为军用与民用。军用方面,无人机分为侦察机和靶机。民用方面,无人机行业应用,是无…

【介绍下Selenium】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…