基于sklearn的LogisticRegression二分类实践

文章目录

    • 1. 预备知识
    • 2. 实践代码
    • 3. 结果对比
      • 3.1 正态分布
      • 3.2 均匀分布
      • 3.3 修改Pipeline
        • 3.3.1 删除多项式转换
        • 3.3.2 删除归一化项
        • 3.3.3 删除多项式转换&归一化
      • 3.4 总结
    • 4. 附
      • 4.1 matplotlib.pyplot.contourf
      • 4.2 numpy 之 np.r_[a,b], np.c_[a,b]

本文使用 sklearn的逻辑斯谛回归模型,进行二分类预测,并通过调整各种参数,对预测结果进行对比。

1. 预备知识

逻辑斯谛回归模型( Logistic Regression,LR)

范数(norm) 几种范数的简单介绍

  • L0 范数:∣∣X∣∣0=#(i∣xi≠0)||X||_0 = \#(i|x_i\neq 0)X0=#(ixi=0) 向量中非零元素个数,由于它没有一个好的数学表示,难以应用。
  • L1 范数:∣∣X∣∣1=∑i=1n∣xi∣||X||_1 = \sum\limits_{i=1}^n |x_i|X1=i=1nxi 表示非零元素的绝对值之和
  • L2 范数:∣∣X∣∣2=∑i=1nxi2||X||_2 = \sqrt{\sum\limits_{i=1}^n {x_i}^2}X2=i=1nxi2 表示元素的平方和再开方

机器学习——正则化 (L1与L2范数)

  • 一般来说,监督学习可以看做最小化下面的目标函数:
    ω∗=arg min⁡ω∑iL(yi,f(xi;ω))+λΩ(ω)\omega^* = \argmin\limits_\omega \sum\limits_i L(y_i, f(x_i;\omega))+\lambda \Omega(\omega)ω=ωargminiL(yi,f(xi;ω))+λΩ(ω) LLL 是损失项(训练误差),Ω\OmegaΩ 项是对参数 ω\omegaω 的规则化函数,去约束模型,使之尽量简单,λ\lambdaλ 为系数,在sklearn的参数中 C=1/λC = 1/\lambdaC=1/λ
  • L1 范数是指向量中各个元素绝对值之和,也叫“稀疏规则算子”(Lasso regularization)
  • L1 范数和 L0 范数可以实现稀疏(趋于产生少量特征,其他为0),L1 因具有比 L0 更好的优化求解特性而被广泛应用。
  • L2 范数是指向量各元素的平方和然后求平方根
  • L2 范数可以防止过拟合,提升模型的泛化能力(选择更多的特征,特征都会接近0)。
    在这里插入图片描述

sklearn中的LogisticRegression模型一文对模型的参数进行了说明

sklearn 中文文档 https://sklearn.apachecn.org/docs/0.21.3/

2. 实践代码

  • 生成以y=-x^2+1.5为分类线的数据集
  • 为增加模型学习难度,将随机抽取的10%的数据强行赋值为正类
  • 尝试通过特征的多项式升维、归一化,然后交给LR模型,训练一个分类曲线。
  • 为了学习到合适的分类曲线,我们尝试了不同的参数组合
'''遇到不熟悉的库、模块、类、函数,可以依次:1)百度(google确实靠谱一些),如"matplotlib.pyplot",会有不错的博客供学习参考2)"终端-->python-->import xx-->help(xx.yy)",一开始的时候这么做没啥用,但作为资深工程师是必备技能3)试着修改一些参数,观察其输出的变化,在后面的程序中,会不断的演示这种办法
'''
# written by hitskyer
# modified by Michael Ming on 2020.2.12
import sys
import numpy as np
import matplotlib.pyplot as plt
# sklearn 中文文档 https://sklearn.apachecn.org/docs/0.21.3/
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn import metricsdef get_parabolic_curve_data_set(n):# 设置随机数的种子,以保证每回运行程序的随机结果一致np.random.seed(520)  # 520 可以随便写 Seed must be between 0 and 2**32 - 1# 随机生成200个样本,每个样本两维特征# X = np.random.normal(0, 1, size=(n, 2))  # 正态分布,中心0,标准差1# 更改X的分布(正态,均匀),看看结果有什么变化X = np.random.uniform(-4, 4, size=(n, 2))  # 均匀分布,区间[-4,4)# 分类面(线)是y=-x^2+1.5,开口向下的抛物线,口内为1类,口外为0类y = np.array(X[:, 0] ** 2 + X[:, 1] < 1.5, dtype=int)  # 满足关系的为1,否则为0# 加入10%的噪声数据for _ in range(n // 10):  # //为整除y[np.random.randint(n)] = 1return X, ydef show_data_set(X, y):plt.scatter(X[y == 0, 0], X[y == 0, 1], c='r')# 散点图,分量1,为y==0的行的0列,分量2,y==0的行的1列,c表示颜色plt.scatter(X[y == 1, 0], X[y == 1, 1], c='b')plt.show()def PolynomialLogisticRegression(degree=2, C=1.0, penalty='l2'):# 对输入特征依次做 多项式转换、归一化转换、类别预测,可以尝试注释掉前2个操作,看看结果有什么不同return Pipeline([# Pipeline 可以把多个评估器链接成一个。例如特征选择、标准化和分类# 以多项式的方式对原始特征做转换,degree次多项式('poly', PolynomialFeatures(degree=degree)),# 对多项式转换后的特征向量做归一化处理,例如(数据-均值)/标准差('std_scaler', StandardScaler()),# 用转换后的特征向量做预测,penalty是正则化约束,C正则化强度,值越小,强度大# solver 不同的求解器擅长的规模类型差异# 正则化 https://blog.csdn.net/zouxy09/article/details/24971995/('log_reg', LogisticRegression(C=C, penalty=penalty, solver="liblinear", max_iter=10000))])def plot_decision_boundary(x_min, x_max, y_min, y_max, pred_func):h = 0.01# 产生网格xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))# ravel将矩阵展平,np_c[a,b]将a,b按列拼在一起Z = pred_func(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)  # 填充等高线# 等高线参考 https://blog.csdn.net/lens___/article/details/83960810def test(X_train, X_test, y_train, y_test, degree=2, C=1.0, penalty='l2'):poly_log_reg = PolynomialLogisticRegression(degree=degree, C=C, penalty=penalty)# 训练模型poly_log_reg.fit(X_train, y_train)# 在训练数据上做测试predict_train = poly_log_reg.predict(X_train)sys.stdout.write("LR(degree = %d, C=%.2f, penalty=%s) Train Accuracy : %.4g\n" % (degree, C, penalty, metrics.accuracy_score(y_train, predict_train)))# 在测试数据上做测试predict_test = poly_log_reg.predict(X_test)score = metrics.accuracy_score(y_test, predict_test)sys.stdout.write("LR(degree = %d, C=%.2f, penalty=%s) Test Accuracy : %.4g\n" % (degree, C, penalty, score))print("--------------------------------------")# 展示分类边界plot_decision_boundary(-4, 4, -4, 4, lambda x: poly_log_reg.predict(x))plt.scatter(X_train[y_train == 0, 0], X_train[y_train == 0, 1], color='r')plt.scatter(X_train[y_train == 1, 0], X_train[y_train == 1, 1], color='b')plt.xlabel("x1")plt.ylabel("x2")plt.rcParams['font.sans-serif'] = 'SimHei'  # 消除中文乱码plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号plt.title("参数:degree:%d, C:%.2f, penalty:%s -- 准确率: %.4f" % (degree, C, penalty, score))plt.show()if __name__ == '__main__':# 随机生成200个拥有2维实数特征 且 分类面(线)为y=-x^2+1.5(换言之,x2=-x1^2+1.5)的语料X, y = get_parabolic_curve_data_set(200)  # 可以加大数据量查看对结果的影响# 预留30%作为测试语料X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)# 展示所生成的数据show_data_set(X, y)# 测试不同的超参数组合print("准确率高,比较恰当的模型")test(X_train, X_test, y_train, y_test, degree=2, C=1.0, penalty='l2')print("准确率高,且恰当的模型")test(X_train, X_test, y_train, y_test, degree=2, C=0.1, penalty='l2')print("准确率高,但是过拟合的模型")test(X_train, X_test, y_train, y_test, degree=20, C=1.0, penalty='l2')print("准确率低,且过拟合的模型")test(X_train, X_test, y_train, y_test, degree=20, C=0.1, penalty='l2')print("准确率高,且恰当的模型")test(X_train, X_test, y_train, y_test, degree=20, C=0.1, penalty='l1')

3. 结果对比

3.1 正态分布

当样本为正态分布时:X = np.random.normal(0, 1, size=(n, 2)) # 正态分布,中心0,标准差1

参数组合数据(正态分布)deg = 2, C=1.00, l2deg = 2, C=0.10, l2deg = 20, C=1.00, l2deg = 20, C=0.10, l2deg = 20, C=0.10, l1
200组数据、seed(520)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.95000.95000.91670.93330.9333
200组数据、seed(777)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.93330.93330.93330.88330.9167
2000组数据 seed(520)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.93330.92170.93170.92330.9317
2000组数据 seed(777)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.91170.89830.92330.90670.9150

对比可以发现:

  • 对比 1,2 列,数据越密集的区域,越容易学到准确的分类边界,且容易克服噪声的影响;
  • 随机种子seed不一样,产生的样本集合不同,在假设的分类模型比较接近真实分类界线(y=-x^2+1.5),随着数据增加,学习到的模型越靠谱;在假设的分类模型比真实分类界限复杂时,在数据密集区域,随着数据增多,配合上正则化,依然可以学习到更准确的模型。在数据稀释区域,模型的复杂度很高,且受噪声数据影响比较大。
  • degree的增加,可以产生高阶的曲线分界
  • 对比 3,4 列,C越大,正则化项作用越小,曲线会越复杂,过拟合会越严重
  • 对比 4,5 列,可见,l1 正则化下的预测分界曲线可能阶数更低(非0参数更少)
  • 分类线实质上是抛物线(2阶),我们用20阶去学习,首先2000组数据不一定充分,其次,由于正态分布数据集中在中心,边缘区域数据覆盖很少,所以周围区域的分类线有时候会奇形怪状,但中心区域的分类还是比较准确的

3.2 均匀分布

当样本为均匀分布时:X = np.random.uniform(-4, 4, size=(n, 2)) # 均匀分布,区间[-4,4)

参数组合数据(均匀分布)deg = 2, C=1.00, l2deg = 2, C=0.10, l2deg = 20, C=1.00, l2deg = 20, C=0.10, l2deg = 20, C=0.10, l1
200组数据、seed(520)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.85000.83330.83330.80000.8333
200组数据、seed(777)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.78330.73330.76670.70000.6667
2000组数据 seed(520)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.87670.87500.90500.89000.8767
2000组数据 seed(777)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.88830.88830.90500.90170.8950
  • 由上面2大组实验(X的分布形式改变),可看出均匀分布下,2000组数据下,各组参数下分类结果均比较好
  • 当数据量比较小时,结果易受到seed随机出来的样本影响(第1,2行),同时,分类效果也不好

3.3 修改Pipeline

sklearn 的 Pipeline简介:

  • 管道机制实现了对机器学习全部步骤的流式化封装和管理
  • 前几步是转换器(Transformer)(如多项式转换、归一化等等),最后一步必须是估计器(Estimator)或叫分类器,输入数据经过转换器处理,输出的结果作为下一步的输入
  • pipeline.fit生成预测模型
  • pipeline.predict对数据进行预测

上面实践代码里Pipeline定义了模型将要做的事情:

  • a. 对数据进行 多项式转换PolynomialFeatures(维度变化)
  • b. 归一化处理StandardScaler(让异常数据不要对正常数据造成很大影响)
  • c. 逻辑斯谛回归LogisticRegression(预测)
def PolynomialLogisticRegression(degree=2, C=1.0, penalty='l2'):# 对输入特征依次做多项式转换、归一化转换、类别预测return Pipeline([# Pipeline 可以把多个评估器链接成一个。例如特征选择、标准化和分类# 以多项式的方式对原始特征做转换,degree次多项式('poly', PolynomialFeatures(degree=degree)),# 对多项式转换后的特征向量做归一化处理,例如(数据-均值)/标准差('std_scaler', StandardScaler()),# 用转换后的特征向量做预测,penalty是正则化约束,C正则化强度,值越小,强度大# solver 不同的求解器擅长的规模类型差异# 正则化 https://blog.csdn.net/zouxy09/article/details/24971995/('log_reg', LogisticRegression(C=C, penalty=penalty, solver="liblinear"))])

在均匀分布的情况下,删除a、删除b、删除a,b,查看对预测的影响

3.3.1 删除多项式转换

参数组合, no ploy数据(均匀分布)deg = 2, C=1.00, l2deg = 2, C=0.10, l2deg = 20, C=1.00, l2deg = 20, C=0.10, l2deg = 20, C=0.10, l1
200组数据、seed(520)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.73330.73330.73330.73330.7333
200组数据、seed(777)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.63330.61670.63330.61670.5667
2000组数据 seed(520)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.69330.69330.69330.69330.6917
2000组数据 seed(777)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.68670.68670.68670.68670.6867
  • 可以看出在删除ploy多项式转换项后,模型维度没有增加,保持线性
  • 预测分类线为一条直线
  • 预测准确率也下降很多,不管怎么调参数,效果甚微

3.3.2 删除归一化项

参数组合, no std_scaler数据(均匀分布)deg = 2, C=1.00, l2deg = 2, C=0.10, l2deg = 20, C=1.00, l2deg = 20, C=0.10, l2deg = 20, C=0.10, l1
200组数据、seed(520)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.86670.86670.85000.85000.8500(Warning)
200组数据、seed(777)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.80000.80000.75000.75000.7176(Warning)
2000组数据 seed(520)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述没跑出来
准确率0.87670.87830.77670.7767-
2000组数据 seed(777)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述没跑出来
准确率0.88830.89170.81000.8133-
  • 可以看出在2阶情况下,没有归一化,影响不是很大
  • 高阶下,没有归一化,对结果影响很大(因为噪声数据下,高阶波动相当大,相当于系统不稳定,conditiona number很大)
//报的Warning
ConvergenceWarning: Liblinear failed to converge, increase the number of iterations."the number of iterations.", ConvergenceWarning)

3.3.3 删除多项式转换&归一化

参数组合, no ploy & no scaler数据(均匀分布)deg = 2, C=1.00, l2deg = 2, C=0.10, l2deg = 20, C=1.00, l2deg = 20, C=0.10, l2deg = 20, C=0.10, l1
200组数据、seed(520)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.73330.76670.73330.76670.7500
200组数据、seed(777)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.61670.66670.61670.66670.6333
2000组数据 seed(520)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.69330.69330.69330.69330.6917
2000组数据 seed(777)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
准确率0.68500.69000.68500.69000.6883
  • 没有多项式与归一化后,分类线表现为一条直线(没有多项式转换)
  • 分类效果也都很差,调参效果很差

3.4 总结

  • 训练数据分布对预测结果有直接影响,数据密集的地方预测较准,数据稀疏的地方,预测不准确(噪声,模型本身都有影响)
  • 特征转换,有助于预测出更高阶的模型
  • 归一化能够降低噪声的影响
  • 加大数据规模一定程度上能够抗噪,提高模型准确率,重复区域高密度的数据一定程度以后,对模型预测也就失去了价值

4. 附

4.1 matplotlib.pyplot.contourf

import numpy as np
import matplotlib.pyplot as plt# 计算x,y坐标对应的高度值
def f(x, y):return x**2+y<1.5# 生成x,y的数据
n = 256
x = np.linspace(-4, 4, n)
y = np.linspace(-4, 4, n)
# 把x,y数据生成mesh网格状的数据,在网格的基础上添加上高度值
X, Y = np.meshgrid(x, y)
# 填充等高线
plt.contourf(X, Y, f(X, Y))
# 显示图表
plt.show()

画出 x**2+y = 1.5 的等高线如下
在这里插入图片描述

4.2 numpy 之 np.r_[a,b], np.c_[a,b]

np.r_
np.c_
用法参考下面:>>> a
array([[1, 2, 3],[7, 8, 9]])
>>> b
array([[4, 5, 6],[1, 2, 3]])
>>> c=np.c_[a,b]
>>> c
array([[1, 2, 3, 4, 5, 6],[7, 8, 9, 1, 2, 3]])
>>> c=np.r_[a,b]
>>> c
array([[1, 2, 3],[7, 8, 9],[4, 5, 6],[1, 2, 3]])
>>> c=np.c_[a.ravel(),b.ravel()] # ravel()展平
>>> c
array([[1, 4],[2, 5],[3, 6],[7, 1],[8, 2],[9, 3]])

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

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

相关文章

Spring Boot 2.2 正式发布,大幅性能提升 + Java 13 支持

之前 Spring Boot 2.2没能按时发布&#xff0c;是由于 Spring Framework 5.2 的发布受阻而推迟。这次随着 Spring Framework 5.2.0 成功发布之后&#xff0c;Spring Boot 2.2 也紧跟其后&#xff0c;发布了第一个版本&#xff1a;2.2.0。下面就来一起来看看这个版本都更新了些什…

剑指Offer - 面试题10- II. 青蛙跳台阶问题

1. 题目 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97&#xff08;1000000007&#xff09;&#xff0c;如计算初始结果为&#xff1a;1000000008&#xff0c;请返回 1。 示例 1&#xff1a…

Gitee倒下了

你好呀&#xff0c;我是歪歪。昨日&#xff0c;趁着午休的美好时光&#xff0c;我正在互联网上愉&#xff08;疯&#xff09;快&#xff08;狂&#xff09;的冲&#xff08;内&#xff09;浪&#xff08;卷&#xff09;。在查询某个技术点的时候&#xff0c;我一不小心&#xf…

Spring Boot 2.x基础教程:Swagger接口分类与各元素排序问题详解

之前通过Spring Boot 2.x基础教程&#xff1a;使用Swagger2构建强大的API文档一文&#xff0c;我们学习了如何使用Swagger为Spring Boot项目自动生成API文档&#xff0c;有不少用户留言问了关于文档内容的组织以及排序问题。所以&#xff0c;就特别开一篇详细说说Swagger中文档…

剑指Offer - 面试题15. 二进制中1的个数(位运算)

1. 题目 请实现一个函数&#xff0c;输入一个整数&#xff0c;输出该数二进制表示中 1 的个数。例如&#xff0c;把 9 表示成二进制是 1001&#xff0c;有 2 位是 1。因此&#xff0c;如果输入 9&#xff0c;则该函数输出 2。 示例 1&#xff1a; 输入&#xff1a;0000000000…

阿里副总裁、达摩院副院长金榕被曝离职!AI科学家集体“逃离“大厂…

文 | 江南教主据Tech星球报道&#xff0c;阿里巴巴副总裁、达摩院副院长金榕已于近期离职&#xff0c;去向还未知。金榕博士毕业于卡耐基梅隆大学&#xff0c;曾是密歇根州立大学终身教授&#xff0c;曾任NIPS、SIGIR等顶级国际学术会议的主席&#xff0c;获得过美国国家科学基…

Spring Boot 2.x基础教程:JSR-303实现请求参数校验

请求参数的校验是很多新手开发非常容易犯错&#xff0c;或存在较多改进点的常见场景。比较常见的问题主要表现在以下几个方面&#xff1a; 仅依靠前端框架解决参数校验&#xff0c;缺失服务端的校验。这种情况常见于需要同时开发前后端的时候&#xff0c;虽然程序的正常使用不…

剑指Offer - 面试题17. 打印从1到最大的n位数

1. 题目 输入数字 n&#xff0c;按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3&#xff0c;则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: n 1 输出: [1,2,3,4,5,6,7,8,9]说明&#xff1a; 用返回一个整数列表来代替打印 n 为正整数来源&#xff1a;力扣…

“AI不会凉!” 她要扛起中国AI落地的大旗

文 | 卖萌酱"这不是无脑吹&#xff0c;也不是鸡汤。她让中国AI落地变得切实有解了。"AI泡沫破了吗&#xff1f;AI能落地了吗&#xff1f;AI不是PPT问题吗&#xff1f;AI终究只是梦一场&#xff1f;面对行外的人&#xff0c;每当卖萌酱说起自己是做AI的&#xff0c;都…

Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档

随着前后端分离架构和微服务架构的流行&#xff0c;我们使用Spring Boot来构建RESTful API项目的场景越来越多。通常我们的一个RESTful API就有可能要服务于多个不同的开发人员或开发团队&#xff1a;IOS开发、Android开发、Web开发甚至其他的后端服务等。为了减少与其他团队平…

剑指Offer - 面试题7. 重建二叉树(递归)

1. 题目 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如&#xff0c;给出前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树&#xff1a;3/ \9 20/ …

郑州大学一女生私自外出染新冠被立案,校方回应:开除!

近日&#xff0c;郑大一女生私自外出会男友&#xff0c;室友替做核酸&#xff0c;感染新冠被立案一事引发大众关注。5月19日&#xff0c;郑州大学一工作人员回应此事称&#xff0c;该私自外出女生已经被自动开除&#xff0c;对室友的处罚要等警方进一步的调查结果&#xff0c;“…

Spring Boot 2.x基础教程:构建RESTful API与单元测试

首先&#xff0c;回顾并详细说明一下在快速入门中使用的Controller、RestController、RequestMapping注解。如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例&#xff0c;建议先看一下快速入门的内容。 Controller&#xff1a;修饰class&#xff0c;用来创建处理http请…

剑指Offer - 面试题11. 旋转数组的最小数字(二分查找)

1. 题目 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。输入一个递增排序的数组的一个旋转&#xff0c;输出旋转数组的最小元素。例如&#xff0c;数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转&#xff0c;该数组的最小值为1。 示例 1&#…

核酸检测机器人来了!体验者:捅的很温柔

编 | 袁榭、桃子源 | 新智元5月21日&#xff0c;上海人工智能研究院宣布「SAIRI赛瑞」智能核酸采样车2.0问世&#xff0c;仅需30秒便可完成一次采样。在新冠流行持续不断、核酸检测逐渐广域常态化的当下&#xff0c;不止一家机构在开发核酸检测的机器人系统2022年5月21日&#…

AI作画新高度!谷歌发布imagen,效果惊艳全场

文 | 梦晨 鱼羊 发自 凹非寺源 | 量子位在让AI搞创作这件事上&#xff0c;谷歌和OpenAI正面刚起来了。这不&#xff0c;震惊全网的DALLE 2才新鲜出炉一个月&#xff0c;谷歌就派出名为Imagen的选手来打擂台。直接上图对比&#xff0c;左边是谷歌Imagen选手眼中的“猫猫绊倒人类…

Spring Boot 2.x基础教程:配置文件详解

在快速入门一节中&#xff0c;我们轻松的实现了一个简单的RESTful API应用&#xff0c;体验了一下Spring Boot给我们带来的诸多优点&#xff0c;我们用非常少的代码量就成功的实现了一个Web应用&#xff0c;这是传统的Spring应用无法办到的&#xff0c;虽然我们在实现Controlle…

剑指Offer - 面试题12. 矩阵中的路径(DFS回溯)

1. 题目 请设计一个函数&#xff0c;用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始&#xff0c;每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格&#xff0c;那么该路径不能再次进入该格子。例如…

一篇论文8778个作者:人均写5个字,署名用了17页

文 | 梦晨(发自凹非寺)源 | 公众号QbitAI一篇论文有8778位作者是什么感觉&#xff1f;在PDF里&#xff0c;光作者列表就要占17页。有人试图把所有名字排版在同一页&#xff0c;字已经小到看不清。这篇论文来自欧洲核子研究中心的ATLAS对撞机合作组&#xff0c;刷新了他们在2015…

Spring Boot 2.x基础教程:工程结构推荐

Spring Boot框架本身并没有对工程结构有特别的要求&#xff0c;但是按照最佳实践的工程结构可以帮助我们减少可能会遇见的坑&#xff0c;尤其是Spring包扫描机制的存在&#xff0c;如果您使用最佳实践的工程结构&#xff0c;可以免去不少特殊的配置工作。 典型示例 以下结构是…