【Sklearn-LR驯化】一文搞懂分类基石模型-逻辑回归使用总结

【Sklearn-驯化】一文搞懂分类基石模型-逻辑回归使用总结

 
本次修炼方法请往下查看
在这里插入图片描述

🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地!
🎇 免费获取相关内容文档关注:微信公众号,发送 pandas 即可获取
🎇 相关内容视频讲解 B站

🎓 博主简介:AI算法驯化师,混迹多个大厂搜索、推荐、广告、数据分析、数据挖掘岗位 个人申请专利40+,熟练掌握机器、深度学习等各类应用算法原理和项目实战经验

🔧 技术专长: 在机器学习、搜索、广告、推荐、CV、NLP、多模态、数据分析等算法相关领域有丰富的项目实战经验。已累计为求职、科研、学习等需求提供近千次有偿|无偿定制化服务,助力多位小伙伴在学习、求职、工作上少走弯路、提高效率,近一年好评率100%

📝 博客风采: 积极分享关于机器学习、深度学习、数据分析、NLP、PyTorch、Python、Linux、工作、项目总结相关的实用内容。


文章目录

    • 🎯 1. 基本介绍
    • 💡 2. 理论介绍
    • 🔍 3. 代码实践
      • 3.1 自己实现
      • 3.2 Sklearn实现
      • 3.3 LR重要参数介绍
    • 🔍 4. 注意事项
    • 🔍 5. 总结

🎯 1. 基本介绍

  逻辑回归是一种广泛应用于分类问题的统计方法,特别是在二分类问题中。尽管名字中有“回归”二字,逻辑回归实际上是一种分类算法。在Python的scikit-learn库中,逻辑回归模型通过LogisticRegression类实现,它使用最大似然估计来训练模型。
  逻辑回归比较高效,不需要太大计算,不需要对特征进行缩放,容易实现。但是该算法分类效果一般,且不能处理非线性问题,因为它的决策边界是线性的。因此,当数据分界面是线性平面的时候,可以采用该算法进行分类。
  个人觉得逻辑回归设计的巧妙一点的地方在于,将wx通过sigmod函数缩放(0,1)之间,这样就可以通过设置sigmoid的函数值来归为哪类,从而使输出值满足二项分布的条件。
  逻辑回归的损失函数为交叉熵损失。这个我个人有这么一个解释:对于分类问题,他的损失函数其实是0-1损失函数,但是这种函数很难进行求解,优化,一般都采用类似趋势的可求导函数进行替代,而逻辑回归则通过极大似然估计来转换成log损失函数来替代0-1损失函数

💡 2. 理论介绍

  在线性回归中,我们假设因变量Y和自变量X之间存在以下线性关系:Y = β₀ + β₁X₁ + β₂X₂ + ... + βₙXₙ,其中β₀是截距,β₁至βₙ是自变量X的系数。通过最小化损失函数来确定最佳的系数估计值。
  在博客中我们会详细推导出最小二乘法的公式,这是一种常见的求解线性回归系数的方法。
  逻辑回归假设 p ( y ∣ x , θ ) p(y|x,\theta) p(yx,θ)服从二项分布,同时对 θ T x \theta^Tx θTx通过函数sigmoid进行数据映射,该函数公式和图表如下所示:

h θ ( x ) = 1 1 + e − z h_{\theta} (x)=\frac{1}{1 + e^{-z}} hθ(x)=1+ez1
其中 z = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . . . . + θ n x n = θ T x z=\theta_{0} + \theta_{1}x_{1}+\theta_{2}x_{2}+......+\theta_{n}x_{n}=\theta^{T}x z=θ0+θ1x1+θ2x2+......+θnxn=θTx

  • 具体的推导过程如下所示:

p ( y = 1 ∣ x ; θ ) = h θ ( x ) p(y=1|x;\theta)=h_{\theta}(x) p(y=1∣x;θ)=hθ(x)
p ( y = 0 ∣ x ; θ ) = 1 − h θ ( x ) p(y=0|x;\theta)=1-h_{\theta}(x) p(y=0∣x;θ)=1hθ(x)

  • 对上面的二项分布的概率函数的具体表达公式如下所示:

p ( y ∣ x ; θ ) = ( h θ ( x ) ) y ∗ ( 1 − h θ ( x ) ) ( 1 − y ) p(y|x;\theta)=(h_{\theta}(x))^y *(1-h_{\theta}(x))^{(1-y)} p(yx;θ)=(hθ(x))y(1hθ(x))(1y)

  • 对上面的概率函数通过MLE进行参数估计:

L ( θ ) = ∏ i = 1 m p ( y i ∣ x i ; θ ) L(\theta)=\prod_{i=1}^{m}p(y^{i}|x^{i};\theta) L(θ)=i=1mp(yixi;θ)
L ( θ ) = ∏ i = 1 m ( h θ ( x ( i ) ) ) y ( i ) ∗ ( 1 − h θ ( x ( i ) ) ) ( 1 − y ( i ) ) L(\theta)=\prod_{i=1}^{m}(h_{\theta}(x^{(i)}))^{y^{(i)}}*(1-h_{\theta}(x^{(i)}))^{(1-y^{(i)})} L(θ)=i=1m(hθ(x(i)))y(i)(1hθ(x(i)))(1y(i))

  • 对上面的似然函数取对数:

l ( θ ) = l o g ( L ( θ ) ) = ∑ i = 1 m y ( i ) l o g ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) l(\theta)=log(L(\theta))=\sum_{i=1}^{m}y^{(i)}log(h_{\theta}(x^{(i)})) + (1-y^{(i)})log(1-h_{\theta}(x^{(i)})) l(θ)=log(L(θ))=i=1my(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))

  • MLE的目的就是求使得 l ( θ ) l(\theta) l(θ)取最大值的 θ \theta θ,由于函数有很好的凹凸性,故可以通过梯度上升法来求得最大值,为了求解的方便可以在前面添加一个负号,近似的求得函数的最优解:
  • 梯度下降法来求取 J ( θ ) J(\theta) J(θ)的最小值,其中参数 θ \theta θ的更新过程如下所示:

θ j : = θ j − α ∂ ∂ θ j J ( θ ) \theta_{j}: = \theta_{j}-\alpha\frac{\partial}{\partial \theta_{j}}J(\theta) θj:=θjαθjJ(θ)

  • 其中学习步长为 α \alpha α,具体的求导过程如下所示:

∂ ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) 1 h θ ( x i ) ∂ ∂ θ j h θ ( x ( i ) ) − ( 1 − y i ) 1 1 − h θ ( x ( i ) ) ∂ ∂ θ j h θ ( x ( i ) ) ) \frac{\partial}{\partial \theta_{j}}=-\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}\frac{1}{h_{\theta}(x^{i})}\frac{\partial}{\partial \theta_{j}}h_{\theta}(x^{(i)})-(1-y^{i})\frac{1}{1-h_{\theta}(x^{(i)})}\frac{\partial}{\partial \theta_{j}}h_{\theta}(x^{(i)})) θj=m1i=1m(y(i)hθ(xi)1θjhθ(x(i))(1yi)1hθ(x(i))1θjhθ(x(i)))
∂ ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) 1 g ( θ T x ( i ) ) − ( 1 − y ( i ) ) 1 1 − g ( θ T x ( i ) ) ) ∂ ∂ θ j g ( θ T x ( i ) ) \frac{\partial}{\partial \theta_{j}}=-\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}\frac{1}{g(\theta^{T}x^{(i)})}-(1-y^(i))\frac{1}{1-g(\theta^{T}x^{(i)})})\frac{\partial}{\partial \theta_{j}}g(\theta^{T}x^{(i)}) θj=m1i=1m(y(i)g(θTx(i))1(1y(i))1g(θTx(i))1)θjg(θTx(i))
∂ ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) 1 g ( θ T x ( i ) ) − ( 1 − y ( i ) ) 1 1 − g ( θ T x ( i ) ) ) g ( θ T x ( i ) ) ( 1 − g ( θ T x ( i ) ) ) ∂ ∂ θ j θ T \frac{\partial}{\partial \theta_{j}}=-\frac{1}{m}\sum_{i=1}^{m} (y^{(i)}\frac{1}{g(\theta^{T}x^{(i)})} - (1-y^{(i)})\frac{1}{1-g(\theta^{T}x^{(i)})})g(\theta^{T}x^{(i)})(1-g(\theta^{T}x^{(i)}))\frac{\partial}{\partial \theta_{j}}\theta^{T} θj=m1i=1m(y(i)g(θTx(i))1(1y(i))1g(θTx(i))1)g(θTx(i))(1g(θTx(i)))θjθT
∂ ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) ( 1 − g ( θ T x ( i ) ) − ( 1 − y ( i ) ) g ( θ T x ( i ) ) ) x j ( i ) \frac{\partial}{\partial \theta_{j}}=-\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}(1-g(\theta^{T}x^{(i)})-(1-y^{(i)})g(\theta^{T}x^{(i)}))x_{j}^{(i)} θj=m1i=1m(y(i)(1g(θTx(i))(1y(i))g(θTx(i)))xj(i)
∂ ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) − g ( θ T x ( i ) ) ) x j ( i ) \frac{\partial}{\partial \theta_{j}}=-\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}-g(\theta^{T}x^{(i)}))x_{j}^{(i)} θj=m1i=1m(y(i)g(θTx(i)))xj(i)
∂ ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) − h θ ( x ( i ) ) ) x j ( i ) \frac{\partial}{\partial \theta_{j}}=-\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}-h_{\theta}(x^{(i)}))x_{j}^{(i)} θj=m1i=1m(y(i)hθ(x(i)))xj(i)
∂ ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\partial}{\partial \theta_{j}}=\frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x_{j}^{(i)} θj=m1i=1m(hθ(x(i))y(i))xj(i)

  • 其中对于sigmod函数的求导如下所示,但是由于逻辑回归的函数设定时是带有负号的,所以带入上式计算时需要注意:

f ( x ) = 1 1 + e g ( x ) f(x)=\frac{1}{1+e^{g(x)}} f(x)=1+eg(x)1
∂ ∂ x f ( x ) = − 1 ( 1 + e g ( x ) ) 2 e g ( x ) ∂ ∂ x g ( x ) \frac{\partial}{\partial x}f(x)=-\frac{1}{(1+e^{g(x)})^2}e^{g(x)}\frac{\partial}{\partial x}g(x) xf(x)=(1+eg(x))21eg(x)xg(x)
∂ ∂ x f ( x ) = − 1 1 + e g ( x ) e g ( x ) 1 + e g ( x ) ∂ ∂ x g ( x ) \frac{\partial}{\partial x}f(x)=-\frac{1}{1+e^{g(x)}}\frac{e^{g(x)}}{1+e^{g(x)}}\frac{\partial}{\partial x}g(x) xf(x)=1+eg(x)11+eg(x)eg(x)xg(x)
∂ ∂ x f ( x ) = − f ( x ) ( 1 − f ( x ) ) ∂ ∂ x g ( x ) \frac{\partial}{\partial x}f(x)=-f(x)(1-f(x))\frac{\partial}{\partial x}g(x) xf(x)=f(x)(1f(x))xg(x)

🔍 3. 代码实践

3.1 自己实现

  自行通过python中的numpy库实现LR的代码,具体如下所示:

 import numpy as np
def predict(w, x):'''w:为训练好的参数w,其数据格式为向量shape(n,m)x:为预测数据特征,其数据格式为向量shape(n,m)'''# 创建sigmod函数形式z = np.dot(w, x)p_sigmod = np.exp(z) / (1 + np.exp(z))# 对sigmod函数输出概率进行判断,将概率等于0.5做为阈值if p_sigmod <= 0.5:return 0else:return 1def train(x, y, iter, step):'''x:训练数据特征,数据格式为向量shape(n, m)y:训练数据label,数据格式为向量(n,1)step:为梯度下降的步长iter:为梯度下降迭代的次数'''# 初始化参数w, 这里没有将参数b加入了,# 如果要加参数b需要将训练数据增加一个维度w = np.zeros(x.shape[1])# 进行iter次随机梯度下降操作for i in range(iter):# 每次迭代遍历所以样本进行随机梯度下降算法,每次随机打乱数据的顺序index= list(range(x.shape[0]))random.shuffle(index)for j, idx in enumerate(data_indices):tmp_x, tmp_y = x[idx], y[idx]# 根据上面的公式最后的最小似然函数的求导结果为:#  h(xi)* xi- xi * yi, 所以先构建h(xi)z = np.dot(w, tmp_x)# 再看上面的梯度下降的算法公式,将构建好的求导结果带入w -= step *((np.exp(z) / (1 + np.exp(z)))*tmp_x - tmp_x*tmp_y)# 也可以直接进行梯度下降操作for i in range(iter):z = np.dot(w, x)w -= step *((np.exp(z) / (1 + np.exp(z)))*x- x*y)
return w

3.2 Sklearn实现

  我们构建简单的数据集,通过sklearn来实现lr的过程,具体代码如下所示:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report# 加载iris数据集
iris = load_iris()
X, y = iris.data, iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建逻辑回归模型实例
model = LogisticRegression(max_iter=200)# 训练模型
model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)# 打印分类报告
print(classification_report(y_test, y_pred))print(f"准确率: {accuracy:.2f}")precision    recall  f1-score   support0.0       0.00      0.00      0.00         01.0       0.00      0.00      0.00         02.0       0.83      1.00      0.91        39
...

3.3 LR重要参数介绍

  在实际的工作中,lr经常调试的参数如下所示:

  • penalty:惩罚方式,默认为"l2",可选择"l1"或"elasticnet"。"l1"使用L1范数作为惩罚项,可以产生稀疏解;"l2"使用L2范数作为惩罚项,可以防止过拟合;"elasticnet"是"l1"和"l2"的组合。

  • C:正则化强度的倒数。与惩罚项相关联,值越小表示更强的正则化。默认为1.0。

  • fit_intercept:是否计算截距项,默认为True。如果选择False,则模型将不会计算截距。

  • solver:优化算法,默认为"lbfgs"。可选择"newton-cg"、“sag"或"liblinear”。"lbfgs"适用于小型数据集;"newton-cg"适用于多分类问题;"sag"适用于大型数据集;"liblinear"适用于二分类问题。

  • max_iter:迭代次数,默认为100。用于控制优化算法的最大迭代次数。

  • multi_class:多分类问题的处理方式,默认为"auto",可选择"ovr"或"multinomial"。"ovr"使用一对多的方法进行多类别分类,"multinomial"使用Softmax回归进行多类别分类。

  • class_weight:类别权重,默认为None。可以使用balanced来自动平衡不均衡的类别。

🔍 4. 注意事项

  • 逻辑回归假设特征和目标变量之间存在线性关系,即使是在分类问题中。
  • 它对异常值不敏感,但对特征的缩放敏感,因此在训练模型前通常需要进行特征标准化或归一化。
  • max_iter参数是最大迭代次数,有时可能需要调整以确保模型能够收敛。
  • 离散特征的增加和减少都很容易,易于模型快速迭代;
  • 稀疏向量内积乘法速廈快,计算结果方便存储,容易扩展;
  • 离散化的特征对异常数据有很强的鲁棒性(比如年龄为300异常值可归为年龄>30这一段);
  • 逻辑回归属于广义线性模型,表达能力受限。单变量离散化为N个后,每个变量有单独的权重,相当于对模型引入了非线性,能够提升模型表达能力,加大拟合;
  • 离散化进行特征交叉,由 M+N 个变量为M*N个变量(将单个特征分成M个取值),进一步引入非线性,提升表达能力;
  • 特征离散化后,模型会更稳定(比如对用户年龄离散化,20-30作为一个区间,不会因为用户年龄,增加一岁变成完全不同的人;
  • 总得来说就是工业界的做法就是:“海量离散特征+简单模型” 同 “少量连续特征+复杂模型”的权衡

🔍 5. 总结

  逻辑回归是处理分类问题的强大工具,特别是在二分类问题中。scikit-learn的LogisticRegression类提供了一个易于使用的接口来训练和预测逻辑回归模型。通过本博客的代码示例,我们学习了如何创建逻辑回归模型,进行训练、预测和评估。希望这篇博客能够帮助你更好地理解逻辑回归模型,并将其应用于实际的分类任务中。

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

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

相关文章

maven 根据不同环境,走不同的实现(多种环境组合)

​ 原因&#xff1a; 线上程序同时支持人大金仓和mysql&#xff0c;且支持根据环境动态选择 java JCE 的实现方式前期已完成 springboot 从mysql 迁移人大金仓 -kingbase &#xff1a;https://blog.csdn.net/qq_26408545/article/details/137777602?spm1001.2014.3001.5502 …

dataX同步SQLserver到MySQL数据

引用datax官方描述&#xff1a; DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS…

商城积分系统的设计方案(中)-- 数模设计

一、总体设计 积分和积分渠道&#xff0c;实现积分种类和发放的动态配置&#xff0c;是设计中的关键之处。 积分订单表是不必要的&#xff0c;视具体业务需求而定。 积分账户和账户收支是核心的两个表。 后面三个表都有一个school_id&#xff0c; 其实就是租户编号&#xff…

PointMamba: A Simple State Space Model for Point Cloud Analysis

1. 论文基本信息 2. 创新点 介绍了第一个状态空间模型 PointMamba&#xff0c;将其应用与点云分析。PointMamba 表现出令人印象深刻的能力&#xff0c;包括结构简单性&#xff08;例如&#xff0c;vanilla Mamba&#xff09;、低计算成本和知识可迁移性&#xff08;例如&#…

如何将编译过的C++库迅速部署在Visual Studio新项目中

本文介绍在Visual Studio中&#xff0c;通过属性表&#xff0c;使得一个新建解决方案中的项目可以快速配置已有解决方案的项目中各类已编译好的C第三方库的方法。 例如&#xff0c;我们现有一个解决方案&#xff0c;其中的一个项目需要调用Armadillo、OpenCV等多个不同的C第三…

爆款短视频素材库有哪些?分享几个容易火的视频素材网站

当今自媒体时代&#xff0c;每位内容创作者都渴望制作出下一个爆款短视频。你是否在寻找那些能让你的视频迅速蹭热度的顶级素材库&#xff1f;本文将为你介绍几个视频素材库&#xff0c;它们或许能成为你成功的秘密武器。首先要提的&#xff0c;自然是著名的国内素材库——蛙学…

SAP PP学习笔记24 - 生产订单(制造指图)的创建

上面两章讲了生产订单的元素。 SAP PP学习笔记22 - 生产订单&#xff08;制造指图&#xff09;的元素1-CSDN博客 SAP PP学习笔记23 - 生产订单&#xff08;制造指图&#xff09;的元素2 - 决济规则(结算规则)-CSDN博客 这一章讲生产订单的创建。比如 - 生产订单的流程&#…

【课程总结】Day12:YOLO的深入了解

前言 在【课程总结】Day11&#xff08;下&#xff09;&#xff1a;YOLO的入门使用一节中&#xff0c;我们已经了解YOLO的使用方法&#xff0c;使用过程非常简单&#xff0c;训练时只需要三行代码&#xff1a;引入YOLO&#xff0c;构建模型&#xff0c;训练模型&#xff1b;预测…

SwiftUI八与UIKIT交互

代码下载 SwiftUI可以在苹果全平台上无缝兼容现有的UI框架。例如&#xff0c;可以在SwiftUI视图中嵌入UIKit视图或UIKit视图控制器&#xff0c;反过来在UIKit视图或UIKit视图控制器中也可以嵌入SwiftUI视图。 本文展示如何把landmark应用的主页混合使用UIPageViewController和…

Meta CEO 扎克伯格批评闭源AI竞争对手:称其试图“创造上帝”|TodayAI

美国社交媒体巨头Meta(Facebook母公司)的CEO马克扎克伯格&#xff08;Mark Zuckerberg&#xff09;近日在一次采访中&#xff0c;公开批评了那些他认为不够开放的AI竞争对手&#xff0c;称他们的行为就像是在“创造上帝”。扎克伯格坚定表示&#xff0c;AI技术不应该被某一家公…

SysML与MBSE的关系

SysML与MBSE的关系 对于任何基于模型的系统工程 &#xff08;MBSE&#xff09; 方法&#xff0c;推荐的最佳实践是基于模型的语言、基于模型的工具、基于模型的流程和基于模型的架构框架的协同应用&#xff0c;如下图所示 系统架构四元组 图。经过十年将SysML应用于棘手的系统…

戴尔md3400存储控制器脱机故障 电池故障处理

看了一下网上关于DELL MD系列存储故障处理的文档还是比较少的&#xff0c;最近处理了一些关于MD系列存储的问题&#xff0c;稍微整理整理就分享一下&#xff0c;各位喜欢摸索的朋友可以稍稍做些参考&#xff0c;当然如果想寻求外援的也可以快速的找到合适的人。以便安全又快捷的…

C语言基础——操作符

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;C语言基础&#xff1b; 文章目录 前言 一、操作符的分类 二、二进制和进制转换 2.1 二进制转十进制 2.1.1 十…

零知识证明基础:数字签名

1、绪论 数字签名(Digital Signature)&#xff0c;也称电子签名&#xff0c;是指附加在某一电子文档中的一组特定的符号或代码。它利用密码技术对该电子文档进行关信息提取并进行认证形成&#xff0c;用于标识签发者的身份以及签发者对电子文档的认可&#xff0c;并能被接收者…

pyqt5 制作视频剪辑软件,切割视频

该软件用于切割视频,手动选取视频片段的起始帧和结束帧并保存为json文件。gui界面如下:包含快进、快退、暂停等功能, 代码如下: # coding=UTF-8 """ theme: pyqt5实现动作起始帧和结束帧的定位,将定位到的帧数保存json文件 time: 2024-6-27 author: cong…

详细介绍LP-SCADA系统的核心数据采集单元

关键字:LP-SCADA系统, 传感器可视化, 设备可视化, 独立SPC系统, 智能仪表系统,SPC可视化,独立SPC系统 SCADA系统的数据采集功能是其核心组成部分&#xff0c;它允许系统从各种传感器、仪器和设备中收集实时数据。以下是SCADA系统数据采集功能的详细描述&#xff1a; 传感器和…

Kotlin vs Java:深入解析两者之间的最新差异与优劣(全面指南)

文章目录 1. 概述2. 语法简洁性3. 空安全4. 扩展函数5. 协程6. 数据类7. 智能类型转换8. 默认参数与命名参数9. 无 checked exceptions10. 单例模式总结 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨…

Java对象类辨识指南:Object与Objects类的区别详解

今天在写lambda表达式时&#xff0c;用filter来做过滤判断我的结果是否为null时使用到了Objects.nonNull&#xff0c;但是敲着敲着发现不对劲&#xff0c;怎么没有nonNull方法?? 其实时我少敲了一个s&#xff0c;当时自己并没有很清楚Object和Objects两者之前的区别&#xf…

LangGPT:高质量提示词框架

题目&#xff1a;LangGPT: Rethinking Structured Reusable Prompt Design Framework for LLMs from the Programming Language作者: Ming Wang; Yuanzhong Liu; Xiaoming Zhang; Songlian Li; Yijie Huang; Chi Zhang; Daling Wang; Shi Feng; Jigang LiDOI: 10.48550/arXiv.2…

Qt自定义信号

1.Teacher类下定义信号signals: Student类下定义槽函数&#xff1a; Teacher.h #pragma once#include <QObject>class Teacher : public QObject {Q_OBJECTpublic:Teacher(QObject *parent);~Teacher(); signals:void Ask(); //老师向学生提问void Ask(QString str);…