梯度下降算法在逻辑回归中的应用

逻辑回归简介

  • sigmoid函数:

g ( z ) = 1 1 + e − z g(z) = \frac{1}{1+e^{-z}} g(z)=1+ez1

请添加图片描述

  • 逻辑回归假设函数

y ^ = h θ ( x ) = g ( θ T x ) = 1 1 + e − θ T x \hat{y} = h_{\theta}(x) = g(\theta^Tx) = \frac{1}{1+e^{-\theta^Tx}} y^=hθ(x)=g(θTx)=1+eθTx1

其中 θ T \theta^T θT x x x延续在梯度下降算法在线性回归中的应用一文中的表达,即:
θ T = [ θ 0 , θ 1 , θ 2 , ⋯ , θ n ] x = [ x 0 x 1 x 2 ⋮ x n ] \theta^T = \begin{bmatrix} \theta_0, \theta_1,\theta_2,\cdots,\theta_n \end{bmatrix}\\ x = \begin{bmatrix} x_0\\ x_1\\ x_2\\ \vdots\\ x_n \end{bmatrix}\\ θT=[θ0,θ1,θ2,,θn]x= x0x1x2xn

  • 损失函数

L ( y ^ , y ) = − y l o g ( y ^ ) − ( 1 − y ) l o g ( 1 − y ^ ) L(\hat{y},y) = -ylog(\hat{y}) - (1-y)log(1-\hat{y}) L(y^,y)=ylog(y^)(1y)log(1y^)

  • 损失函数可以这样理解,当某一样本的真实标签 y = 1 y=1 y=1(正类)时,损失函数变为:

L ( y ^ , y ) = − l o g ( y ^ ) L(\hat{y}, y) = -log(\hat{y}) L(y^,y)=log(y^)

请添加图片描述

  • 我们希望损失函数越小越好,那么也就是说希望 y ^ \hat{y} y^越大越好,而 y ^ \hat{y} y^表示是的概率,定义域是 [ 0 , 1 ] [0,1] [0,1] y ^ \hat{y} y^最大只能是1,与 y = 1 y = 1 y=1相同。
  • 同样的,当某一样本的真实标签 y = 0 y=0 y=0(负类)时,损失函数变为:

L ( y ^ , y ) = l o g ( 1 − y ^ ) L(\hat{y},y) = log(1-\hat{y}) L(y^,y)=log(1y^)

请添加图片描述

我们希望损失函数越小越好,那么也就是说希望 y ^ \hat{y} y^越小越好,而 y ^ \hat{y} y^表示是的概率,定义域是 [ 0 , 1 ] [0,1] [0,1] y ^ \hat{y} y^最小只能是0,与 y = 0 y = 0 y=0相同。

  • 代价函数

J ( θ ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) = 1 m ∑ i = 1 m [ − y ( i ) l o g ( y ^ ( i ) ) − ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ) ] = 1 m ∑ i = 1 m [ − y ( i ) l o g ( 1 1 + e − θ T x ( i ) ) − ( 1 − y ( i ) ) l o g ( 1 1 + e − θ T x ( i ) ) ] \begin{align} J(\theta) &= \frac{1}{m}\sum^m_{i=1}L(\hat{y}^{(i)}, y^{(i)})\\ &= \frac{1}{m}\sum^m_{i=1}[-y^{(i)}log(\hat{y}^{(i)}) - (1-y^{(i)})log(1-\hat{y}^{(i)})]\\ &= \frac{1}{m}\sum^m_{i=1}\left[-y^{(i)} log\left(\frac{1}{1+e^{-\theta^Tx^{(i)}}}\right) - (1-y^{(i)})log\left(\frac{1}{1 + e^{-\theta^Tx^{(i)}}}\right)\right] \end{align} J(θ)=m1i=1mL(y^(i),y(i))=m1i=1m[y(i)log(y^(i))(1y(i))log(1y^(i))]=m1i=1m[y(i)log(1+eθTx(i)1)(1y(i))log(1+eθTx(i)1)]

梯度下降算法求解逻辑回归

  • J ( θ ) J(\theta) J(θ) θ j \theta_j θj求偏导, θ j \theta_j θj表示第 j j j θ \theta θ的值:

∂ ∂ θ j J ( θ ) = ∂ ∂ θ j 1 m ∑ i = 1 m [ − y ( i ) l o g ( 1 1 + e − θ T x ( i ) ) − ( 1 − y ( i ) ) l o g ( 1 1 + e θ T x ( i ) ) ] = 1 m ∑ i = 1 m [ y ( i ) l o g ( 1 + e − θ T x ( i ) ) + ( 1 − y ( i ) ) l o g ( 1 + e θ T x ( i ) ) ] \begin{align} \frac{\partial}{\partial\theta_j}J(\theta) &= \frac{\partial}{\partial\theta_j} \frac{1}{m}\sum^m_{i=1}\left[-y^{(i)} log\left(\frac{1}{1+e^{-\theta^Tx^{(i)}}}\right) - (1-y^{(i)})log\left(\frac{1}{1 + e^{\theta^Tx^{(i)}}}\right)\right]\\ &=\frac{1}{m}\sum^m_{i=1}\left[y^{(i)} log\left(1+e^{-\theta^Tx^{(i)}}\right) + (1-y^{(i)})log\left(1 + e^{\theta^Tx^{(i)}}\right)\right]\\ \end{align} θjJ(θ)=θjm1i=1m[y(i)log(1+eθTx(i)1)(1y(i))log(1+eθTx(i)1)]=m1i=1m[y(i)log(1+eθTx(i))+(1y(i))log(1+eθTx(i))]

  • l o g ( 1 + e θ T x ( i ) ) log\left(1+e^{\theta^Tx^{(i)}}\right) log(1+eθTx(i))​求偏导,注意这里采用复合函数求导法则

∂ ∂ θ j l o g ( 1 + e − θ T x ( i ) ) = 1 1 + e − θ T x ( i ) × e − θ T x ( i ) × − x j ( i ) = − x j ( i ) e − θ T x ( i ) 1 + e − θ T x ( i ) \begin{align} \frac{\partial}{\partial\theta_j}log\left(1+e^{-\theta^Tx^{(i)}}\right) &= \frac{1}{1 + e^{-\theta^Tx^{(i)}}} \times e^{-\theta^Tx^{(i)}} \times -x^{(i)}_{j}\\ & = \frac{-x^{(i)}_{j}e^{-\theta^Tx^{(i)}}}{1 + e^{-\theta^Tx^{(i)}}} \end{align} θjlog(1+eθTx(i))=1+eθTx(i)1×eθTx(i)×xj(i)=1+eθTx(i)xj(i)eθTx(i)

  • 则,原式为:

∂ ∂ θ j J ( θ ) = 1 m ∑ i = 1 m [ − y ( i ) × − x j ( i ) e − θ T x ( i ) 1 + e − θ T x ( i ) + ( 1 − y ( i ) ) × x j ( i ) e θ T x ( i ) 1 + e θ T x ( i ) ] = 1 m ∑ i = 1 m [ − y ( i ) × − x j ( i ) e θ T x ( i ) + 1 + ( 1 − y ( i ) ) × x j ( i ) e θ T x ( i ) 1 + e θ T x ( i ) ] = 1 m ∑ i = 1 m [ − x j ( i ) y ( i ) + x j ( i ) e θ T x ( i ) − y ( i ) x j ( i ) e θ T x ( i ) 1 + e θ T x ( i ) ] = 1 m ∑ i = 1 m [ − y ( i ) ( 1 + e θ T x ( i ) ) + e θ T x ( i ) 1 + e θ T x ( i ) x j ( i ) ] = 1 m ∑ i = 1 m [ ( − y ( i ) + e θ T x ( i ) 1 + e θ T x ( i ) ) x j ( i ) ] = 1 m ∑ i = 1 m [ ( − y ( i ) + 1 e − θ T x ( i ) + 1 ) x j ( i ) ] = 1 m ∑ i = 1 m [ ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) ] \begin{align} \frac{\partial}{\partial\theta_j}J(\theta) &=\frac{1}{m}\sum^{m}_{i=1}\left[-y^{(i)} \times \frac{-x^{(i)}_{j}e^{-\theta^Tx^{(i)}}}{1 + e^{-\theta^Tx^{(i)}}} + (1-y^{(i)})\times\frac{x^{(i)}_{j}e^{\theta^Tx^{(i)}}}{1 + e^{\theta^Tx^{(i)}}}\right]\\ & = \frac{1}{m}\sum^{m}_{i=1}\left[-y^{(i)} \times \frac{-x^{(i)}_{j}}{e^{\theta^Tx^{(i)}} + 1} + (1-y^{(i)})\times\frac{x^{(i)}_{j}e^{\theta^Tx^{(i)}}}{1 + e^{\theta^Tx^{(i)}}}\right]\\ & = \frac{1}{m}\sum^{m}_{i=1}\left[\frac{-x_j^{(i)}y^{(i)} + x_j^{(i)}e^{\theta^Tx^{(i)}} - y^{(i)}x_j^{(i)}e^{\theta^Tx^{(i)}}}{1 + e^{\theta^Tx^{(i)}}}\right]\\ & = \frac{1}{m}\sum^{m}_{i=1}\left[\frac{-y^{(i)}(1 + e^{\theta^Tx^{(i)}}) + e^{\theta^Tx^{(i)}}}{1 + e^{\theta^Tx^{(i)}}} x_j^{(i)} \right]\\ & = \frac{1}{m}\sum^{m}_{i=1}\left[\left(-y^{(i)} + \frac{e^{\theta^Tx^{(i)}}}{1 + e^{\theta^Tx^{(i)}}}\right)x_j^{(i)}\right]\\ & = \frac{1}{m}\sum^{m}_{i=1}\left[\left(-y^{(i)} + \frac{1}{e^{-\theta^Tx^{(i)}} + 1}\right)x_j^{(i)}\right]\\ & = \frac{1}{m}\sum^{m}_{i=1}\left[\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)x_j^{(i)}\right]\\ \end{align} θjJ(θ)=m1i=1m[y(i)×1+eθTx(i)xj(i)eθTx(i)+(1y(i))×1+eθTx(i)xj(i)eθTx(i)]=m1i=1m[y(i)×eθTx(i)+1xj(i)+(1y(i))×1+eθTx(i)xj(i)eθTx(i)]=m1i=1m[1+eθTx(i)xj(i)y(i)+xj(i)eθTx(i)y(i)xj(i)eθTx(i)]=m1i=1m[1+eθTx(i)y(i)(1+eθTx(i))+eθTx(i)xj(i)]=m1i=1m[(y(i)+1+eθTx(i)eθTx(i))xj(i)]=m1i=1m[(y(i)+eθTx(i)+11)xj(i)]=m1i=1m[(hθ(x(i))y(i))xj(i)]

根据梯度下降算法公式,迭代公式为:
θ j : = θ j − α 1 m ∑ i = 1 m [ ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) ] \theta_j := \theta_j - \alpha\frac{1}{m}\sum^{m}_{i=1}\left[\left(h_\theta(x^{(i)}) - y^{(i)}\right)x_j^{(i)}\right] θj:=θjαm1i=1m[(hθ(x(i))y(i))xj(i)]
上面的 : = := :=符号表示先算右边的式子,算完后赋值给左边的变量。注意:左边和右边的 θ i \theta_i θi值并不相等,右边是迭代前的 θ i \theta_i θi值,左边的迭代后 θ i \theta_i θi的值。

python代码实现

  • 导入必要包
import numpy as np
import statsmodels.api as sm
from tqdm.notebook import tqdm
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing, make_regression
  • 读取数据函数
def load_data(data_path):data = np.loadtxt(data_path,delimiter=',')n = data.shape[1]-1data_x = data[:,0:n]data_y = data[:,-1].reshape(-1,1)return data_x,data_y
  • sigmoid函数
def sigmoid(z):r = 1/(1 + np.exp(-z))return r
  • 逻辑回归函数
def logic_lr(data_x, theta):z = np.dot(data_x,theta)return sigmoid(z)
  • 代价函数
def compute_loss(data_x, data_y, theta):row_num, col_num = data_x.shapel = -1 * data_y * np.log(logic_lr(data_x, theta)) - (1-data_y)*np.log(1-logic_lr(data_x, theta))return np.sum(l)/row_num
  • 梯度下降算法求解逻辑回归函数
def solve_logic_lr(data_x, data_y, theta, alpha, steps):temp_ones = np.ones(data_x.shape[0]).transpose()data_x = np.insert(data_x, 0, values=temp_ones, axis=1)row_num, col_num = data_x.shapeloss_list = []for step in range(steps):loss_list.append(compute_loss(data_x, data_y, theta))for i in range(col_num):theta[i] = theta[i] - (alpha/row_num) * np.sum((logic_lr(data_x, theta) - data_y) * data_x[:,i].reshape(-1,1))return theta, loss_list
  • 预测函数
def predict(data_x, theta):temp_ones = np.ones(data_x.shape[0]).transpose()data_x = np.insert(data_x, 0, values=temp_ones, axis=1)p = logic_lr(data_x, theta)p[p >= 0.5] = 1p[p < 0.5] = 0return p
  • 函数调用
data_x, data_y = load_data('/kaggle/input/studyml/cls.txt')
data_x, mu, sigma = data_std(data_x)
# 变成列向量
theta = np.zeros(data_x.shape[1]+1).reshape(-1,1)
steps = 100
alpha = 0.0001
theta, loss = solve_logic_lr(data_x, data_y, theta, alpha, steps)
print(theta)
# 打印输出:[0.0009, 0.0027, 0.00249]
  • 绘制Loss曲线(左)和拟合效果图(右)
plt.figure(figsize=(12,5),dpi=600)
plt.subplot(1,2,1)
plt.plot(loss)
plt.title("Loss Curve")
plt.xlabel("steps")
plt.ylabel("loss")
plt.subplot(1,2,2)
plt.scatter(data_x[:,0],data_x[:,1],c=data_y)
temp_x1 = np.arange(min(data_x[:,0]), max(data_x[:,0]), 0.1)
temp_x2 = -(theta[1] * temp_x1 + theta[0])/theta[2]
plt.plot(temp_x1, temp_x2)
plt.title("Fitting Effect Diagram")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

请添加图片描述

带L2正则化的逻辑回归

  • 引入L2正则化,用于惩罚大的回归系数,减轻过拟合。则代价函数变为:

J ( θ ) = 1 m ∑ i = 1 m [ − y ( i ) l o g ( 1 1 + e − θ T x ( i ) ) − ( 1 − y ( i ) ) l o g ( 1 1 + e − θ T x ( i ) ) ] + λ 2 m ∥ θ ∥ 2 2 \begin{align} J(\theta) &= \frac{1}{m}\sum^m_{i=1}\left[-y^{(i)} log\left(\frac{1}{1+e^{-\theta^Tx^{(i)}}}\right) - (1-y^{(i)})log\left(\frac{1}{1 + e^{-\theta^Tx^{(i)}}}\right)\right] + \frac{\lambda}{2m}\lVert \theta \rVert_2^2 \end{align} J(θ)=m1i=1m[y(i)log(1+eθTx(i)1)(1y(i))log(1+eθTx(i)1)]+2mλθ22

  • 根据上述的推导,可以得到 J ( θ ) J(\theta) J(θ) θ j \theta_j θj的偏导数为:

∂ ∂ θ j J ( θ ) = 1 m ∑ i = 1 m [ ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) ] + 1 m × λ θ j \frac{\partial}{\partial\theta_j}J(\theta) = \frac{1}{m}\sum^{m}_{i=1}\left[\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)x_j^{(i)}\right] + \frac{1}{m} \times \lambda\theta_j θjJ(θ)=m1i=1m[(hθ(x(i))y(i))xj(i)]+m1×λθj

根据梯度下降算法公式,迭代公式为:
θ j : = θ j − α 1 m ∑ i = 1 m [ ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) + λ θ j ] \theta_j := \theta_j - \alpha\frac{1}{m}\sum^{m}_{i=1}\left[\left(h_\theta(x^{(i)}) - y^{(i)}\right)x_j^{(i)} + \lambda\theta_j \right] θj:=θjαm1i=1m[(hθ(x(i))y(i))xj(i)+λθj]

python代码实现

  • 在上面的基础上,只需要修改代价函数和梯度下降求解函数就可以了
  • 代价函数变为:
def compute_loss(data_x, data_y, theta, lambd):row_num, col_num = data_x.shapel = -1 * data_y * np.log(logic_lr(data_x, theta)) - (1-data_y)*np.log(1-logic_lr(data_x, theta))return np.sum(l)/row_num + (lambd/2*row_num) + np.sum(np.power(theta,2))
  • 梯度下降求解函数变为:
def solve_logic_lr(data_x, data_y, theta, alpha, steps, lambd=0.01):temp_ones = np.ones(data_x.shape[0]).transpose()data_x = np.insert(data_x, 0, values=temp_ones, axis=1)row_num, col_num = data_x.shapeloss_list = []for step in range(steps):loss_list.append(compute_loss(data_x, data_y, theta, lambd))for i in range(col_num):theta[i] = theta[i] - (alpha/row_num) * np.sum((logic_lr(data_x, theta) - data_y) * data_x[:,i].reshape(-1,1) + lambd * theta[i])return theta, loss_list
  • 函数调用
data_x, data_y = load_data('/kaggle/input/studyml/cls.txt')
data_x, mu, sigma = data_std(data_x)
# 变成列向量
theta = np.zeros(data_x.shape[1]+1).reshape(-1,1)
steps = 100
alpha = 0.0001
theta, loss = solve_logic_lr(data_x, data_y, theta, alpha, steps)
print(theta)
  • 绘制Loss曲线(左)和拟合效果图(右)
plt.figure(figsize=(12,5),dpi=600)
plt.subplot(1,2,1)
plt.plot(loss)
plt.title("Loss Curve")
plt.xlabel("steps")
plt.ylabel("loss")
plt.subplot(1,2,2)
plt.scatter(data_x[:,0],data_x[:,1],c=data_y)
temp_x1 = np.arange(min(data_x[:,0]), max(data_x[:,0]), 0.1)
temp_x2 = -(theta[1] * temp_x1 + theta[0])/theta[2]
plt.plot(temp_x1, temp_x2)
plt.title("Fitting Effect Diagram")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

请添加图片描述

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

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

相关文章

我的世界!

每位冒险家在《我的世界》中的出生点都各不相同&#xff0c; 有的出生在桦木森林&#xff0c;有的出生在草原&#xff0c; 还有的出生在临近海洋的沙滩。 这些环境叫做生物群系&#xff0c;也常被称为生态系统。 在《我的世界》中的不同生物群系具有不同的地域特色—— 不…

Redis的五种数据类型与命令

目录 引言 一 Redis的特性 二 Redis的安装 三 Redis的优点 四 Redis的五种数据类型与命令 五 Redis的配置文件 引言 Redis是什么&#xff1f; Remote Dictionary Service(远程字典服务器) Redis 是一个开源的(BSD许可)的&#xff0c;C语言编写的&#xff0c;高性能的数…

羊大师:夏夜贪凉,但为啥肚子还要‘保暖计划’?

在这个夏夜&#xff0c;当空调与风扇齐飞&#xff0c;冰镇西瓜与凉面共舞之时&#xff0c;你是否也曾有过这样的疑惑&#xff1a;明明热得汗流浃背&#xff0c;为啥老一辈总念叨着“睡觉再热也要给肚子盖被子”&#xff1f;这背后&#xff0c;藏着的可不仅仅是老一辈的固执&…

centos7手动编译安装redis-6.2.1.tar.gz

本章教程,主要通过手动编译安装的方式,进行安装redis-6.2.1版本,如果需要安装其它版本的,可以在这里找到对应版本进行下载,安装步骤基本上差不多。 下载地址:https://download.redis.io/releases/ 一、下载安装包 wget https://download.redis.io/releases/redis-6.2.1.…

SSM学习9:SpringBoot简介、创建项目、配置文件、多环节配置

简介 SpringBoot式用来简化Spring应用的初始搭建以及开发过程的一个框架 项目搭建 File -> New -> Project 选中pom.xml文件&#xff0c;设置为maven项目 项目启动成功 可以访问BasicController中的路径 配置文件 在resources目录下 application.properties 默…

powershell自定义命令别名

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、查看命令别名二、常见的别名三、自定义别名1.GUI编辑2.命令行编辑 总结 前言 有时候在windows上使用powershell时候常常苦于别名问题&#xff0c;像我这样…

昇思25天学习打卡营第25天|基于MindSpore的GPT2文本摘要

基于MindSpore的GPT2文本摘要 Tips&#xff1a;安装依赖库 pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2.14 pip install mindnlp下载数据集&#xff1a; from mindnlp.utils import http_get# download dataset url https://download.mindspore.…

Android AutoSize屏幕适配:适配不同屏幕大小的尺寸,让我们无需去建立多个尺寸资源文件

目录 AutoSize是什么 AutoSize如何使用 一、AndroidautoSize是什么 在开发产品的时候&#xff0c;我们会遇到各种各样尺寸的屏幕&#xff0c;如果只使用一种尺寸去定义控件、文字的大小&#xff0c;那么到时候改起来就头皮发麻。以前使用dime的各种类库&#xff0c;文件太多…

敏捷CSM证书国家认可嘛?有什么价值?

CSM证书&#xff0c;全称为Certified Scrum Master&#xff0c;是由Scrum Alliance&#xff08;敏捷联盟&#xff09;颁发的一项国际公认的敏捷管理领域认证。该证书不仅在全球范围内受到广泛认可&#xff0c;也在国内得到了业界的广泛关注和重视。 CSM证书的背景 CSM证书是基…

从原理到实践:开发视频美颜SDK与主播美颜工具详解

本篇文章&#xff0c;笔者将深入探讨视频美颜SDK的开发原理和实践应用&#xff0c;重点介绍如何打造一款功能强大的主播美颜工具。 一、视频美颜的基本原理 视频美颜的核心在于图像处理技术&#xff0c;主要包括面部识别、图像增强和特效处理。 1.面部识别 常见的面部识别算…

Codeforces Round 874 (Div. 3)(A~D题)

A. Musical Puzzle 思路: 用最少的长度为2的字符串按一定规则拼出s。规则是&#xff1a;前一个字符串的尾与后一个字符串的首相同。统计s中长度为2的不同字符串数量。 代码: #include<bits/stdc.h> #include <unordered_map> using namespace std; #define N 20…

昇思25天学习打卡营第20天|CV-ResNet50图像分类

打卡 目录 打卡 图像分类 ResNet网络介绍 数据集准备与加载 可视化部分数据集 残差网络构建 Building Block 结构 代码实现 Bottleneck结构 代码实现 构建ResNet50网络 代码定义 模型训练与评估 可视化模型预测 重点&#xff1a;通过网络层数加深&#xff0c;感知…

如何让微课视频更生动?试试这些实时美颜录屏软件!

在数字化教学的浪潮中&#xff0c;真人出镜的微课变得越来越受欢迎。除了清晰的讲解声&#xff0c;老师们偶尔需要亲自出镜&#xff0c;结合生动有趣的动画元素或实地拍摄&#xff0c;让知识传递更加直观和有趣。但问题来了&#xff0c;如何在录制微课时&#xff0c;让摄像头下…

Spring Boot 引入 Guava Retry 实现重试机制

为什么要用重试机制 在如今的系统开发中&#xff0c;为了保证接口调用的稳定性和数据的一致性常常会引入许多第三方的库。就拿缓存和数据库一致性这个问题来说&#xff0c;就有很多的实现方案&#xff0c;如先更新数据库再删除缓存、先更新缓存再更新数据库&#xff0c;又或者…

C++ | Leetcode C++题解之第278题第一个错误的版本

题目&#xff1a; 题解&#xff1a; class Solution { public:int firstBadVersion(int n) {int left 1, right n;while (left < right) { // 循环直至区间左右端点相同int mid left (right - left) / 2; // 防止计算时溢出if (isBadVersion(mid)) {right mid; // 答案…

错误解决 error CS0117: ‘Buffer‘ does not contain a definition for ‘BlockCopy‘

Unity 2022.3.9f1 导入 Runtime OBJ Importer 后出现&#xff1a; error CS0117: ‘Buffer’ does not contain a definition for ‘BlockCopy’ 解决办法&#xff1a; 源代码&#xff1a; int DDS_HEADER_SIZE 128; byte[] dxtBytes new byte[ddsBytes.Length - DDS_HEAD…

MediatR 使用记录-发布订阅运行机制测试

注意&#xff1a;mediatR发布-订阅&#xff0c;订阅方是多个的时候是串行的&#xff0c;一个执行完才执行下一个 // 发送部分代码Console.WriteLine($"{DateTime.Now}-发送开始-");mediator.Publish<TestEvent>(new TestEvent("nancy"));Console.Wr…

HarmonyOS NEXT零基础入门到实战-第四部分

自定义组件: 概念: 由框架直接提供的称为 系统组件&#xff0c; 由开发者定义的称为 自定义组件。 源代码&#xff1a; Component struct MyCom { build() { Column() { Text(我是一个自定义组件) } } } Component struct MyHeader { build() { Row(…

Charles的使用配置(二)

Charles基础设置 抓包端口&#xff1a;Proxy->Proxy settings,全部选 设置系统的代理服务器 Charles电脑证书配置 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/304c604776bc45d59463c621c5a097e6.png Charles端设置SSL的端口 Proxy->ssl Proxying…

MSP430芯片解锁 以立创开发板 ti开发板为例

参考自无名小哥的ppt第二部分自下而上读 b站视频讲解&#xff1a;