李宏毅2020机器学习课程笔记(一)- 分类与回归_李宏毅 机器学习 笔记-程序员宅基地

技术标签: python  机器学习(付费)  机器学习  人工智能  

相关专题: 李宏毅2020机器学习资料汇总
本系列笔记:

  1. 李宏毅2020机器学习课程笔记(一)- 分类与回归
  2. 李宏毅2020机器学习课程笔记(二)- 深度学习
  3. 李宏毅2020机器学习课程笔记(三)- CNN、半监督、RNN


1. 课程简介

Course Introduction(P1)

2020版课程介绍,李宏毅老师详细解释本课程的学习路线


2020版少了一个机器学习的整体介绍,建议点击2019年视频补充,关于监督学习、半监督学习、无监督学习、迁移学习、强化学习的简介。

在这里插入图片描述
机器学习中所谓的模型其实是指一个函数


Rule of ML 2020(P2)

助教介绍pyenv的安装和使用、kaggle,学生如何利用github完成作业,评分以及助教的联系方式。


2. Regression

Case Study (P3)

机器学习入门——回归,预测准确的数值。

非常有趣的一课,以“预测宝可梦的CP值”作引,李宏毅老师介绍了回归(同时,也是机器学习)的整体过程。

整体过程(后面会反复用到,博主称它叫机器学习三步骤吧):

  1. 定义模型集合/函数集合。
  2. 定义损失函数(LOSS)来评价模型/函数好坏。
  3. 选择最好的模型/函数。

这里的模型实际上就是函数 y = f ( x ) y=f(x) y=f(x),后面可能会直接简称模型

简述梯度下降(Gradient Descent ):

  1. 单个参数的梯度下降。
  2. 两个参数的梯度下降。

回归问题的损失函数是凸函数(convex),意味着一定会找到全局最优解。但是,其它的机器学习问题中,多个参数的梯度下降可能会陷入局部最优解。

过拟合、欠拟合的问题及解决方法。

过拟合时,一个方法是使用正则化。
正则化的作用是降低模型的泛化误差。

选择模型时,更倾向于选择“平滑”的模型。因为当数据有噪声干扰时,越平滑的函数受到噪声的干扰越小。

回归问题的机器学习三步骤:

  1. 定义模型集合:
    f = w ⋅ x + b = ∑ i w i x i + b f=\boldsymbol w \cdot \boldsymbol x+\boldsymbol b=\sum_{i} w_{i} x_{i}+\boldsymbol b f=wx+b=iwixi+b
  2. 定义损失函数(LOSS)来评价模型好坏:
    L ( f ) = L ( w , b ) = 1 2 ∑ n ( f ( x n ) − y ^ n ) 2 = 1 2 ∑ n ( w ⋅ x n + b − y ^ n ) 2 \begin{aligned} L(f)&=L(w,b)\\ &=\frac{1}{2} \sum_{n}\left(f\left(x^{n}\right)-\hat{y}^{n}\right)^{2}\\ &=\frac{1}{2} \sum_{n}\left( w \cdot x^n+b-\hat{y}^{n}\right)^{2} \end{aligned} L(f)=L(w,b)=21n(f(xn)y^n)2=21n(wxn+by^n)2
  3. 选择最好的模型:
    梯度下降法
    w ∗ , b ∗ = arg ⁡ min ⁡ w , b L ( w , b ) w^{*}, b^{*}=\arg \min\limits_{w, b} L(w, b) w,b=argw,bminL(w,b)
    梯度
    ∇ L = [ ∂ L ∂ w ∂ L ∂ b ] g r a d i e n t = [ − 2 ∑ i = 1 n ( y ^ n − ( b + w ⋅ x n ) ) x i n − 2 ∑ i = 1 n ( y ^ n − ( b + w ⋅ x n ) ) ] \nabla L=\left[\begin{array}{l}\frac{\partial L}{\partial w} \\ \frac{\partial L}{\partial b}\end{array}\right]_{g r a d i e n t} =\left[\begin{array}{l} -2\sum\limits_{i=1}^n{\left(\hat{y}^{n}-\left(b+w \cdot x_{}^{n}\right)\right)}x_i^n\\ -2\sum\limits_{i=1}^n{\left(\hat{y}^{n}-\left(b+w \cdot x_{}^{n}\right)\right)} \end{array}\right] L=[wLbL]gradient= 2i=1n(y^n(b+wxn))xin2i=1n(y^n(b+wxn))
    其中, x i n x_i^n xin表示向量 x n = [ x 1 n , x 2 n , . . . , x i n , . . . ] x^n=[x^n_1,x^n_2,...,x^n_i,...] xn=[x1n,x2n,...,xin,...]中第i维的值。

Basic concept(P4)

理论解释“误差来自哪里?”——偏差(bias)和方差(variance)

在这里插入图片描述
回归中,复杂的模型包含简单的模型(令高次项系数为0)。

模型在拟合数据时,越简单的模型,受到特殊的取样数据点的影响越小,所以方差越小。

一般来说,

  • 简单的模型(左侧)有大的bias和小的variance
  • 复杂的模型(右侧)有小的bias和大的variance【瞄得越来越准,但误差越来越大】

在这里插入图片描述
欠拟合(underfitting):误差来源于bias——模型不能很好地拟合训练数据。

  • 解决方法:重新设计模型(欠拟合时,采集更多数据是没用的)
  1. 增加更多的特征作为输入
  2. 选择更复杂的模型

过拟合(overfitting):误差来源于variance——模型拟合了训练数据,但在测试数据上有很大误差。

  • 解决方法:
  1. 更多数据——采集or生成
  2. 正则化

理想结果:平衡bias和variance,得到一个较好的模型。

训练集、验证集、测试集的划分,交叉验证(cross validation)和k折(k-fold)交叉验证。

在这里插入图片描述
注1:将训练数据分为测试集和验证集。

做实验、发表论文时所谓的测试集,实际上是一个public testing set,而真正的测试集是一个private testing set,是一个谁也不知道的东西(我们不知道后人会输入什么数据到模型中),因此,我们不应该以public testing set作为选择模型的标准,而是应该以validation的结果来选择最好的模型。

注2:用validation选好模型后,可以把测试集和验证集一起作为训练数据,再对模型进行一次训练。但是!千万不要在看到public testing set的结果后,再想着去调整训练好的模型,这样的调整是无意义的。


以上红色标注的点,博主以前都搞错了,一直以为是直接把数据集分成training、testing、validation,而validation=testing,因此,博主以前都是直接在testing上做测试,根据测试结果调整超参数,不用validation。现在看来这一做法不妥。最近翻阅花书(《深度学习》),书上面也是李宏毅老师的这一说法。


Gradient Descent(P5、P6、P7)

这里有三个视频,不过实际上P6和P7都只有几分钟,是李宏毅老师用游戏来解释梯度下降法。

P5讲了梯度下降法的三个tips:

Tips1:自动调整学习率η

Adagrad这一自动梯度下降法的具体实现过程,并且,李宏毅老师给了示例,解答了Adagrad中“梯度越大,step不一定越大”这一问题,最好的步伐是 ∣ 一次微分 ∣ 二次微分 \frac{|一次微分|}{二次微分} 二次微分一次微分

在这里插入图片描述
图中可视化了学习率对训练时Loss的影响。不同颜色的线代表不同的学习率,随着训练次数增加,Loss的变化趋势不同。

当你在训练模型的时候,建议把这张图画出来,这样才可以判断你的学习率是否合适。

Tips2:Stochastic Gradient Descent(SGD)使训练更快

Tips3:特征放缩(Feature Scaling)归一化参数

李宏毅老师用数学公式(泰勒展开)说明了梯度下降法的工作原理,并解释了梯度下降法的局限。

我们一般认为:梯度下降法的局限是训练可能会陷入局部最优解(局部最小值,local minima),无法到达全局最小值。但是,实际情况可能更糟糕。当我们真正训练模型的时候,我们会定义一个终止值 δ \delta δ表示无穷小,在梯度接近于0( < δ <\delta <δ)的地方就会停下来,而这个地方不一定是全局最小值,它可能是局部最小值,也可能是鞍点(saddle point),甚至可能是一个损失函数很大的平缓高原(plateau)。
在这里插入图片描述

P6用世纪帝国这个游戏说明为何用梯度下降法会陷入局部最优解。

P7用Minecraft这个游戏说明为何在梯度下降法中,梯度可能会先升后降。

Optimization for Deep Learning(P8、P9)

* 2020新增内容,由助教讲授

不过……讲得不太清楚,就随缘听听吧。


Classification(P10)

机器学习的另一经典问题——分类,与回归的“预测数值”不同,分类需要“预测标签”。

首先,李宏毅老师详细解释了为何不能将分类问题直接当作回归问题(即,分类问题直接用回归的损失函数)来解。

Q:多分类问题为什么不可以直接当作回归问题?

A:类别1变成数值1,类别2变成数值2,类别3变成数值3……暗示类别1与类别2比较接近,与类别3比较远,实际上并无此关系。

当然,确实有将多分类当做回归来解的模型(感知机,SVM等),但是需要修改损失函数。

李宏毅老师用“给宝可梦分类”的例子详细推导了如何正确求解一个分类问题(涉及贝叶斯公式、高斯分布、极大似然估计等),该模型为生成模型。

Q:为什么是生成模型?
A:假设数据遵循一个均值为 μ \mu μ、协方差矩阵为 Σ \Sigma Σ的高斯分布。利用从高斯分布中生成数据的概率,即似然(likelihood),来估计 P ( x ∣ C 1 ) P(x|C_1) P(xC1)(从类别 C 1 C_1 C1中任取一个样本,它是x的概率)

Q:为什么要假设数据的分布是高斯分布?
A:(李宏毅:我知道,就算假设是别的分布,你也一定会问这个问题!)你可以假设任意你喜欢的分布,比如二元分类,可以假设伯努利分布。高斯分布比较简单,参数也比较少(每个类别的高斯分布都共享协方差矩阵 Σ \Sigma Σ)。

Q:为什么不同类别要共享协方差矩阵 Σ \Sigma Σ
A:如果每个类别 i i i都有一个协方差矩阵 Σ i \Sigma_i Σi,那么一方面,variance过大,容易过拟合,另一方面,共享协方差矩阵可以减少参数个数。

总结——分类问题的三步骤:

  1. 定义模型集合
    样本x属于类别1的概率(后验):
    P ( C 1 ∣ x ) = P ( C 1 ) P ( x ∣ C 1 ) P ( C 1 ) P ( x ∣ C 1 ) + P ( C 2 ) P ( x ∣ C 2 ) P\left(C_{1} | x\right)=\frac{P\left(C_{1}\right) P\left(x | C_{1}\right)}{P\left(C_{1}\right) P\left(x | C_{1}\right)+P\left(C_{2}\right) P\left(x | C_{2}\right)} P(C1x)=P(C1)P(xC1)+P(C2)P(xC2)P(C1)P(xC1)
    如果 P ( C 1 ∣ x ) > 0.5 P\left(C_{1}| x\right)>0.5 P(C1x)>0.5,则x属于类别1;否则,x属于类别2.
  2. 定义损失函数(LOSS)来评价模型好坏
    假设高斯分布,利用已有的数据,求得 μ \mu μ Σ \Sigma Σ。最大化评价参数好坏的指标,即极大似然估计 L ( μ , Σ ) L(\mu,\Sigma) L(μ,Σ)
  3. 找到最好的模型
    μ ∗ , Σ ∗ = arg max ⁡ μ , Σ L ( μ , Σ ) \mu^*,\Sigma^*=\argmax\limits_{\mu,\Sigma}L(\mu,\Sigma) μ,Σ=μ,ΣargmaxL(μ,Σ)
    实际上,(背公式)最佳参数就是每个类别中,所有样本点的均值和协方差。比如,类别1的最佳均值与协方差:
    μ 1 ∗ = 1 n 1 ∑ i = 0 n 1 x i \mu^*_1=\frac{1}{n_1} \sum_{i=0}^{n_1} x^{i} μ1=n11i=0n1xi
    Σ 1 ∗ = 1 n 1 ∑ i = 0 n 1 ( x i − μ 1 ∗ ) ( x i − μ 1 ∗ ) T \Sigma^{*}_1=\frac{1}{n_1} \sum_{i=0}^{n_1}\left(x^{i}-\mu^{*}_1\right)\left(x^{i}-\mu^{*}_1\right)^{T} Σ1=n11i=0n1(xiμ1)(xiμ1)T
    注1:均值是每个类别单独求出的。
    注2:协方差先每个类别单独求出,然后共享的协方差为所有协方差的加权平均值 Σ ∗ = n 1 N Σ 1 ∗ + n 2 N Σ 2 ∗ + . . . \Sigma^*=\frac{n_1}{N}\Sigma^{*}_1+\frac{n_2}{N}\Sigma^{*}_2+... Σ=Nn1Σ1+Nn2Σ2+...

最后,李宏毅老师通过对后验概率的数学变形,推导出了sigmod函数 σ ( z ) \sigma(z) σ(z),以及实际上, z = w ⋅ x + b z=\boldsymbol w \cdot \boldsymbol x+\boldsymbol b z=wx+b。在计算时,可以跳过 μ \mu μ Σ \Sigma Σ,直接求出 w \boldsymbol w w b b b,见下一章(logistic regression).

在这里插入图片描述
在这里插入图片描述


Logistic Regression(P11)

博主的一点题外话:Logistic Regression经常被翻译成逻辑回归。周志华的西瓜书《机器学习》上指出这是误译,这里的logistic和逻辑(logit)并无关系,实际上是与log相关,译成对数几率回归或者对数回归之类的会比较好一点……反正不知道怎么翻译,下文还是称呼为Logistic Regression吧。

Logistic Regression常用于解决二分类问题,由上一章,李宏毅老师引入了Logistic Regression的另一种模型表达方式,损失函数是交叉熵的形式。

总结:

  1. 定义模型集合
    f w , b ( x ) = P w , b ( C 1 ∣ x ) = σ ( z ) = 1 1 + e − z f_{w,b}(x)=P_{w, b}\left(C_{1} | x\right)=\sigma(z)=\frac{1}{1+e^{-z}} fw,b(x)=Pw,b(C1x)=σ(z)=1+ez1
    z = w ⋅ x + b = ∑ i w i x i + b z=\boldsymbol w \cdot \boldsymbol x+\boldsymbol b=\sum_{i} w_{i} x_{i}+\boldsymbol b z=wx+b=iwixi+b
  2. 定义损失函数(LOSS)来评价模型好坏
    w ∗ , b ∗ = arg ⁡ max ⁡ w , b L ( w , b ) = arg ⁡ min ⁡ w , b ( − ln ⁡ L ( w , b ) ) w^{*}, b^{*}=\arg \max \limits_{w, b} L(w, b)=\arg\min \limits_{w, b}(-\ln L(w, b)) w,b=argw,bmaxL(w,b)=argw,bmin(lnL(w,b))
    通过 ln ⁡ \ln ln将连乘变成连加,简化了计算机的计算,而且在计算机中,连乘后的数值容易溢出,变成连加后,数值不容易溢出。
    − ln ⁡ L ( w , b ) = ∑ n − [ y ^ n ln ⁡ f w , b ( x n ) + ( 1 − y ^ n ) ln ⁡ ( 1 − f w , b ( x n ) ) ] -\ln L(w, b)=\sum_{n}-\left[\hat{y}^{n} \ln f_{w, b}\left(x^{n}\right)+\left(1-\hat{y}^{n}\right) \ln \left(1-f_{w, b}\left(x^{n}\right)\right)\right] lnL(w,b)=n[y^nlnfw,b(xn)+(1y^n)ln(1fw,b(xn))]
    C ( f ( x n ) , y ^ n ) = − y ^ n ln ⁡ f w , b ( x n ) − ( 1 − y ^ n ) ln ⁡ ( 1 − f w , b ( x n ) ) C(f(x^n),\hat{y}^{n})=-\hat{y}^{n} \ln f_{w, b}\left(x^{n}\right)-\left(1-\hat{y}^{n}\right) \ln \left(1-f_{w, b}\left(x^{n}\right)\right) C(f(xn),y^n)=y^nlnfw,b(xn)(1y^n)ln(1fw,b(xn))
    是两个伯努利分布的交叉熵。
    一个代表真值的分布,一个代表预测值的分布。
    补充阅读:一文搞懂交叉熵在机器学习中的使用,透彻理解交叉熵背后的直觉
  3. 找到最佳模型
    梯度下降法,参数更新为: w i = w i − η ∑ n − ( y ^ n − f w , b ( x n ) ) x i n w_{i}=w_{i}-\eta \sum_{n}-\left(\hat{y}^{n}-f_{w, b}\left(x^{n}\right)\right) x_{i}^{n} wi=wiηn(y^nfw,b(xn))xin

公式记忆之sigmoid的微分值: ∂ σ ( z ) ∂ z = σ ( z ) ( 1 − σ ( z ) ) \frac{\partial \sigma(z)}{\partial z}=\sigma(z)(1-\sigma(z)) zσ(z)=σ(z)(1σ(z))

然后,李宏毅老师用表格归纳了Logistic Regression和线性回归的异同。

在这里插入图片描述

Q:为什么logistic regression的损失函数不能和linear regression一样,是square error?
A:可以试一下 logistic regression + square error.


在第3步的梯度下降法中, L ( f ) = 1 2 ∑ n ( f ( x n ) − y ^ n ) 2 L(f)=\frac{1}{2} \sum_{n}\left(f\left(x^{n}\right)-\hat{y}^{n}\right)^{2} L(f)=21n(f(xn)y^n)2 w w w求导后的结果为 ( f w , b ( x ) − y ^ ) f w , b ( x ) ( 1 − f w , b ( x ) ) x i \left(f_{w, b}(x)-\hat{y}\right) f_{w, b}(x)\left(1-f_{w, b}(x)\right) x_{i} (fw,b(x)y^)fw,b(x)(1fw,b(x))xi(博主简化了常数项,只保留了函数的主体)
在下列四种情况下:

  • 真值 y ^ n = 1 \hat{y}^n=1 y^n=1,预测值 f w , b ( x n ) = 1 f_{w,b}(x^n)=1 fw,b(xn)=1,离目标很时,梯度为0;
  • 真值 y ^ n = 1 \hat{y}^n=1 y^n=1,预测值 f w , b ( x n ) = 0 f_{w,b}(x^n)=0 fw,b(xn)=0,离目标很时,梯度为0;
  • 真值 y ^ n = 0 \hat{y}^n=0 y^n=0,预测值 f w , b ( x n ) = 1 f_{w,b}(x^n)=1 fw,b(xn)=1,离目标很时,梯度为0;
  • 真值 y ^ n = 0 \hat{y}^n=0 y^n=0,预测值 f w , b ( x n ) = 0 f_{w,b}(x^n)=0 fw,b(xn)=0,离目标很时,梯度为0;
    梯度更新的效果都不好。因为不论预测值离目标远还是近,更新速度都很慢。
    在这里插入图片描述

生成模型(上一章中利用高斯分布求后验概率的模型)和判别模型(logistic regression)的差异。

生成模型作了假设,而判别模型没有作假设。

  • 生成模型:
    P ( C 1 ∣ x ) = P ( C 1 ) P ( x ∣ C 1 ) P ( C 1 ) P ( x ∣ C 1 ) + P ( C 2 ) P ( x ∣ C 2 ) = σ ( z ) z = ( μ 1 − μ 2 ) T Σ − 1 x − 1 2 ( μ 1 ) T Σ − 1 μ 1 + 1 2 ( μ 2 ) T Σ − 1 μ 2 + ln ⁡ N 1 N 2 \begin{aligned} P\left(C_{1} | x\right)&=\frac{P\left(C_{1}\right) P\left(x | C_{1}\right)}{P\left(C_{1}\right) P\left(x | C_{1}\right)+P\left(C_{2}\right) P\left(x | C_{2}\right)}=\sigma(z)\\ z&=\left(\mu^{1}-\mu^{2}\right)^{T} \Sigma^{-1}x-\frac{1}{2}\left(\mu^{1}\right)^{T} \Sigma^{-1} \mu^{1}+\frac{1}{2}\left(\mu^{2}\right)^{T} \Sigma^{-1} \mu^{2}+\ln \frac{N_{1}}{N_{2}} \end{aligned} P(C1x)z=P(C1)P(xC1)+P(C2)P(xC2)P(C1)P(xC1)=σ(z)=(μ1μ2)TΣ1x21(μ1)TΣ1μ1+21(μ2)TΣ1μ2+lnN2N1

  • 判别模型:
    f w , b ( x ) = P w , b ( C 1 ∣ x ) = σ ( z ) = σ ( ∑ i w i x i + b ) f_{w,b}(x)=P_{w, b}\left(C_{1} | x\right)=\sigma(z)=\sigma(\sum_{i} w_{i} x_{i}+\boldsymbol b) fw,b(x)=Pw,b(C1x)=σ(z)=σ(iwixi+b)

同样的数据,用生成模型和判别模型得到的 w w w b b b是不一样的。

普遍认为,生成模型的性能不如判别模型的性能。不过,生成模型也有优点:

  1. 因为假设了概率分布,所以需要的训练数据较少。
  2. 因为假设了概率分布,所以受噪声影响较小。
  3. 可以从其它资源处估算先验概率和类别独立概率。

然后,李宏毅老师继续介绍了多分类问题,以三分类问题为例子,引入了softmax函数。

从二分类logistic regression到多分类logistic regression的交叉熵问题:补充资料(多类别逻辑回归 与 交叉熵损失函数

最后,李宏毅老师提到了 logistic regression 的局限,由此引出了特征转换(feature regression),将多个logistic regression模型联结起来组成了神经网络,而其中的一个 logistic regression 模型就是一个神经元(neuron)。

博主的题外话:这个从logistic regression到神经网络的引入确实厉害,值得大家认真听一下。
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iteapoy/article/details/105752567

智能推荐

android播放rtsp视频流app, demo app .使用live555+MediaCodec_安卓查看rtsp串流的apk-程序员宅基地

文章浏览阅读8.4k次,点赞2次,收藏14次。用libvlc提供的库播放rtsp,总是延迟比较大(局域网的情况下,存在明显的画面延时),netcaching设置为0还是存在延迟,但是网络延迟已经比较低了,没办法,自己写了一个APP,现在只测试了接受一个视频流的rtp流,没有音频。延迟较低,总的播放延迟基本在网络部分。原理:1.0 解码播放端:使用android 的MediaCodec 播放h264流,先行使用h264裸流文件模拟网络流进行..._安卓查看rtsp串流的apk

评价类问题——熵权法_熵权法归一化-程序员宅基地

文章浏览阅读2.6k次。熵权法文章目录熵权法前言一、理论二、算法步骤例前言构建完评价体系后在选择合适的评价方法即可,体系建立应秉持全面、准确、独立的三要素在评价类问题中,需要兼顾指标体系权重评价方法通常分为①主观:发问卷做调查(容易受到样本个数、样本质量限制),找专家赋权(上网查找别的研究报告)等等。层次分析法(判断矩阵基本上是由个人进行填写)②客观量化:从数据入手进行赋权只从数据出发,不考虑问题的实际背景,确定权重时就可能出现与常识相悖的情况。因此其适用于主观因素影响不大时的评价场景,业务经验不会使_熵权法归一化

数据库详解!外模式|概念模式|范式|ER图_数据库外模式-程序员宅基地

文章浏览阅读1.8k次。数据库系统(DBS)由4部分组成:1. 数据库:统一管理、长期存储在计算机内的相关数据的集合2. 硬件:构成计算机系统包括存储数据所需的外部设备3. 软件:操作系统、数据库管理系统(DBMS)4. 人员:系统分析和数据库设计人员、用户、数据库管理员DBA数据库管理系统(DBMS)的功能:实现对共享数据有效的组织、管理和存取。包括数据定义、数据库操作、数据库运行管理、存储管理、数据库的建立和维护等。_数据库外模式

C# 中的 null 类型详解与在使用null类型时,有哪些常见陷阱需要避免?_c#数据有null值,如何避免tolist报异常-程序员宅基地

文章浏览阅读1.2k次,点赞17次,收藏25次。在 C# 中,null 是一个特殊的值,表示引用类型的空值。对于值类型(例如 int、float、double 等),null 不是一个有效的赋值,因为值类型不能为 null。只有引用类型(例如类、接口、数组等)才能被赋值为 null。null 是一个只读的静态成员,它在程序中的所有部分都是相同的。null.Value 是一个编译时常量,它的值为 null。_c#数据有null值,如何避免tolist报异常

spring boot电影院售票与管理系统 毕业设计源码论文+答辩PPT_springboot答辩ppt-程序员宅基地

文章浏览阅读4.2k次,点赞5次,收藏58次。登录模块:登录模块是进入系统的入口,所有用户必须登录后才能访问系统。登录需要输入用户名和密码,如果多次尝试登录需要输入验证码。登录时需要选择用户的角色,是一般用户还是管理员登录等。登录成功后,会通过数据库获取用户的权限,并跳转至用户的主页面。管理员用户管理模块:管理员管理包括:管理员的添加,修改和删除操作。添加管理员时,先判断用户添加的管理员是否是admin(超级管理员),如果不是则添加成功。修改时候,如果是超级管理员,可以修改所有管理员的信息,如果是普通管理员,那么只能修改自己的信息……_springboot答辩ppt

macbook 卸载双系统_macos 12.6如何卸载双系统-程序员宅基地

文章浏览阅读956次。macbook 卸载双系统_macos 12.6如何卸载双系统

随便推点

win10安装CH340驱动,总是预安装成功怎么办,其实很简单_ch340串口驱动 仅预安装-程序员宅基地

文章浏览阅读1.5w次,点赞9次,收藏10次。win10安装CH340驱动我用stm32单片机,安装CH340驱动一直提示预安装成功,总是成功不了。然后我把电脑用usb线连接51单片机,再点击安装,一秒成功,硬件管理器中显示COM口。_ch340串口驱动 仅预安装

Google Coral硬件的边缘计算与本地AI-程序员宅基地

文章浏览阅读1.1k次。AI使机器能够执行过去仅属于人类领域的各种任务。例如:是否需要在工厂生产线上进行质量控制?设置AI驱动的摄像头以发现产品缺陷。如何分析医疗数据?机器学习可以从扫描中识别出潜在的肿瘤并将其标记给医生。但是,只有这样的应用程序既快速又安全,它们才有用。在工厂中使用AI摄像头花费几分钟来处理图像的设备并不多,而且如果将其发送到云端进行分析,没有患者愿意冒着暴露其医疗数据的风险。这些是Google...

自定义 Qt 选中样式的 QGraphicsItem_qgraphicsitem 选中-程序员宅基地

文章浏览阅读489次。在用户与图形元素进行交互时,我们可能需要对选中状态进行特殊处理,以便于用户更好的理解当前正在操作的元素。首先,我们可以重载 QGraphicsItem 的 paint 方法,在其中判断元素是否处于选中状态,如果是,则使用特定的样式进行绘制。然后,在 QGraphicsScene 中,我们可以通过设置 QGraphicsItem 的选中样式来触发我们的自定义绘制。默认情况下,Qt 提供了一套很好的选中状态的样式,但是有时候我们需要更具体的样式来满足我们的需求,这就需要自定义选中样式。_qgraphicsitem 选中

【转载】PCB设计方法和技巧_pcb serpentine spacing是什么-程序员宅基地

文章浏览阅读3k次。1、如何选择PCB板材?选择PCB板材必须在满足设计需求和可量产性及成本中间取得平衡点。设计需求包含电气和机构这两部分。通常在设计非常高速的PCB板子(大于GHz的频率)时这材质问题会比较重要。例如,现在常用的FR-4材质,在几个GHz的频率时的介质损(dielectric lo_pcb serpentine spacing是什么

QT相关知识(含面经)_qt面经-程序员宅基地

文章浏览阅读949次,点赞3次,收藏29次。本篇文章讲解了Qt中的各种内存管理机制,算是做了一个比较全面的描述。之所以说是必读,是因为笔者在工作中发现,内存管理确实非常重要。Qt内存管理机制是贯穿整个Qt中所有类的核心线索之一,搞懂了内存管理能在脑海中形成内存中对象的布局图,写代码的时候才能下笔如有神,管理起项目中众多的对象才能游刃有余,提高开发效率;能够减少bug的产生。有经验的开发者应该知道,内存问题很难调试定位到具体的位置,往往导致奇怪的bug出现。能够帮助理解Qt众多类的底层不变的逻辑,学起来更容易。_qt面经

gdal进行遥感影像读写_如何使用遥感影像进行矿物勘探-程序员宅基地

文章浏览阅读340次。gdal进行遥感影像读写Meet Jose Manuel Lattus, a geologist from Chile. In the latest Soar Cast, he discusses his work in mineral exploration and environmental studies, and explains how he makes a living by crea..._遥感图像 矿物探测

推荐文章

热门文章

相关标签