3 Unsupervised learning recommenders reinforcement learning

news2024/11/16 2:32:20

文章目录

  • Week1
    • Unsupervised Learning
    • Clustering
    • K-means
      • principle
      • Optimization objective
      • Initializing K-means
      • chose the number of clusters
    • Anomaly Detection
      • Find unusual events
      • Algorithm
      • chose epsilon
      • Anomally Detection vs Supervised learning
      • features
  • Week2
    • Recommender System
      • Collaborative filtering algorithm
      • Binary labels
    • Recommender Systems implementation
      • Mean normalization
      • tensorflow implementation
      • Find related items
      • Limitations of Collaborative Filtering
    • Content-based Filtering
      • Content-based filtering algorithm
      • Recommending from a large catalogue
    • Principal Component Analysis(现在用处很少)
  • Week3
    • Reinforcement Learning
    • batch and soft-update

本系列参考视频:吴恩达的machine-learing 可去coursera官网查看
链接
然后就是比较偏向的是个人笔记,具体就是个人的理解能力以及复盘能力有所差异,这边仅当做个参考,做个笔记式的学习。

这边有看到有别的up进行搬运,这边就也一并粘贴出来:
链接

Week1

Unsupervised Learning

在这里插入图片描述
无监督学习现在主流的就分为下面的几类:

  1. 聚类问题
  2. 异常检测
  3. 推荐系统
  4. 强化学习

而这一些,后面也会慢慢的进行介绍。

Clustering

在这里插入图片描述
在这里插入图片描述
在监督学习的分类当中,我们我存在明确的y标签用于分类,如最上面的图,而在无监督学习当中,我们所选取的是没有标签的数据,让机器自己去分门别类出这些数据,自己去聚类。

K-means

principle

首先讲一下K-means的工作原理:

  1. 先随机选点作为分类的簇中心
    在这里插入图片描述
  2. 根据距离长远,进行分类。
    在这里插入图片描述
  3. 算这一类的均值,得到新的聚类中心:
    在这里插入图片描述
    之后不断循环,直到某个指标(后面会谈)达到,也就是分好类,也可以说是收敛。
    在这里插入图片描述

但是在这个流程中其实有一个问题就是,我们在分类的时候,有可能让其中一个类的数量(点)为0,这是可能出现的,在这种情况下,我们一般采取的措施都是直接去掉这个簇,或者还有一种方式是重新重置随机这个点。

Optimization objective

在这里插入图片描述

在无监督学习当中,我们按照机器学习的角度进行分析,此时实际上还是可以看到他也是拥有cost-function,也可以当成是loss,相同的,我们的目的就是让这个loss变小,然后在机器学习当中我们是通过loss反向计算梯度,来让相关的参数进行下降,而在k-means当中我们是通过得到分簇之后,然后通过求平均位置来让其下降,然后不断迭代循环,那么有人就问了,那这个损失函数有什么用呢,hh,评估用的,有时候并不需要使用损失函数来对参数进行反解。

还有上文的图中值得关注的就是k和m的值是不一致的,自己想一下为什么,之前解释过。

然后现在就需要进行解释为什么我们采用平均值的方法可以导致这个损失函数最终收敛,这个给出证明图吧,个人觉得很简单,就不去证明了。

单拿一个维度为例子:
在这里插入图片描述

Initializing K-means

对于原始簇中心的点的初始化的位置,往往会影响数据生成的效果:
前提:K < m (K就是想要分成的类,不一定是真实分成的类,C代表的就是对应的类,M就是点的总数)

在这里插入图片描述
在上图当中我们是可以看出来,在很大的情况下,随着我们的初始化的点的位置不一样,最后的效果实际上也是不一样的(实际上就是陷入了local minimal),拿如何去抉择一个好的分类呢?

当然此时就需要用到损失函数了。我们通过损失来判断这个方法得到的分类的效果到底好不好

在这里插入图片描述

chose the number of clusters

我们上面介绍过分类出来的类别的总数是不固定的,或者也可以说我们在选择分成的类数也是不固定的,那么该怎么判断这个超参数的好坏呢?

一个方法是使用肘法:(不推荐)
在这里插入图片描述
寻找一个梯度变化最慢的位置,但有时候我们会发现实际上没有这么一个点,他的变化都很平缓,还有就是这种方法没有下面的方法好。

第二种就是,通过实际的检验,或者成本分析之类的方法进行调整:
在这里插入图片描述
例如这个T-shirt的例子:

我们分成多少类,实际上取决于这个成本以及购买的分析,属于一个不在机器学习考虑的问题上,或者就是说没有提供给机器学习来考虑这个问题的信息。

Anomaly Detection

Find unusual events

异常检测也是最近一个比较火的热门领域,这边先稍微介绍一下:
在这里插入图片描述
就如上面的探究中,我们收集相关特征,并给出相关的数据集,然后拿一个需要预测的新的x输入,判断这个是否存在异常,这就是使用的过程。

在这里插入图片描述
具体的流程所采用的就是拿一个阈值概率来进行判断,我们拿新的点放入之后,查看他位于多少比率的位置上,然后我们选定那个阈值概率,当在外面的时候就需要进行检测,当在内部的时候就是正常的点。

Algorithm

首先就是我们默认数据的分布都满足高斯分布,(就算不满足的话,后面也会有方法进行处理),先当作满足高斯分布。

然后就是我们采用的概率预测是:
在这里插入图片描述
认为特征之间满足独立性(即使不满足也没关系,实际上求取的都是一个正相关的关系),然后真实的概率,就等于按照x1的高斯概率,和x2的高斯概率,所有起来相乘,这边再次解释一下f(x;m,n)这种公式的意思,在分号前是需要给进去的输出,m和n是根据x之后算出的值,也就是需要多算一步的,并不是需要给入的值,然后f根据这些参数进行运算。

然后给一个比较完整的流程:
在这里插入图片描述
然后这时候我们就会发现那个阈值不知道该怎么进行选择,选择不同,当然最后得到的效果也就会不同。

chose epsilon

实际上在这个选择当中,我们采用的方法是类似与监督学习的方式进行,后面会解释他和传统监督学习的差别。

在这里插入图片描述
我们还是需要一些带有标签的数据,比如这里,我们常用的就是我们会需要两个数据集:

  1. 第一个数据集train:内部放上全是非异常的样例,我们一般把非异常的样例的y-label当作0.
  2. 第二个数据集valid:内部放上很大一部分非异常的数据集,记住一定数量一定要大,然后再放上部分异常的数据,并进行标记y-label为1,最后在这个异常检测当中,我们手动调整epsilon,最好能让这20个全都显示异常。

并且此时我们的调整,实际上可以使用上,之前讲解的混淆矩阵:
在这里插入图片描述
个人感觉重点关注Recall,Recall需要100%,需要这么调整。

Anomally Detection vs Supervised learning

在这里插入图片描述
这边稍微讲解一下适用场景吧:

  1. 对于监督学习来说,监督学习适合于根据自己以往给出的数据集进行推理,他在特征已经出现了进行训练的地方进行训练,往往可以得到好的效果,就比如判断是不是猫,就基本那几种类型,比较不会出现新的特征。
  2. 对于异常检测,他适合于一些时常会有新的特征出现的场景,不仅仅是他训练起来方便,而且他也更适合于判断这种类型(实践证明),比如说欺诈,隔一段时间就会出现新的欺诈方式,如果仅仅使用监督学习来说,效果是不太好的,原因就是监督学习比较倾向于学习那些已经出现过的。

features

由于上文我们讲解过我们使用的特征默认其满足高斯分布,但有时候确实部分不满足,这就需要我们进行手动调整(别直接使用layernormalization,这是会改变分布的):
在这里插入图片描述
我们采用的方法是先绘制出来x的分布直方图,然后通过数学函数调整,调整满足之后,我们在检测的时候也需要对对应的特征进行一样的处理。

而处理的方式一般有2中:

  1. log(x+c) 方法,我们可以调整c的值,来让x更满足高斯分布。
  2. x^(小于1的数) 方法,这也是一种方法。

在这里插入图片描述

还有就是关于特征的增加方面:
我们不仅可以传入新的信息,更可以加上:
在这里插入图片描述
相关的判断式子,这些取决于我们对于业务的理解。

Week2

Recommender System

先给出,一般来说我们所知道的数据集:
在这里插入图片描述
一般存在两种情况,这是其一,先按照这种进行讲解,就是按照用户给对应的产品的评分作为实际的评分,记为r(i,j)。

然后介绍一下这张表中的内容,我们用用户对于这一个电影的评分作为r,然后?就是这个用户并没有看过这个内容,所以并没有对于这个内容进行评分。

然后下面先假设我们知道每一个movie对应的属性,x,因为r实际上是需要我们进行预测的,我们需要x进行预测,先假设x,是我们所知道的,后面再介绍x会怎么求出:
在这里插入图片描述
我们假设这个表中存在已知两个特征:x1,x2,然后现在我们的目的就是给出?的那些的评分,从而给出相关的判断,判断他是不是可能喜欢这部电影,如果喜欢就给出相关的推荐。

然后我们采用的预测也比较简单,就是之前最常用的线性预测,不过需要注意的是w和b都是矩阵,然后这边采用的是dot-product,一般也可以转化为multiplication。

然后解释一下参数,在这个图当中,我们可以发现每一个仅仅只需要两个参数w和b,以及这个电影的特征x即可算出最后的个人的推荐评分,一个人对应的就只有一列w和b,这是需要关注的。

而cost function自然也简单:
在这里插入图片描述
由于我们预测出来的数字并没有要求他是满足分类的效果的,所以采用的可以是均方误差作为loss,所以就有上图。

至此大概就是我们常见的一个分析流程

Collaborative filtering algorithm

协同过滤算法:
在很多情况下对于x标签我们是并不知道的,这个也是需要我们进行训练的出的。
在这里插入图片描述
此时我们会发现,就需要通过知道w和b 然后进行反推x的值。

于是就有:
在这里插入图片描述
但此时会发现陷入了一个小的循环,我们想要知道x就需要知道w和b,想要知道w和b就需要知道x,于是产生了协同过滤这种算法:

在这里插入图片描述
准确来说就是我们就是给x,w,b都假设一个初始值,然后一起放入运算,只知道最后预测出来的y,通过y和最终的偏差,然后对于这三个参数都进行梯度下降:
在这里插入图片描述

所以这也是一种无监督学习,在之前我们讲解的无监督学习中,我们都是只知道x,但是并不知道y的值,让其根据一定的算法进行分类预测,而这边的推荐算法,则相反我们知道y,然后让其自动猜测出x,以及那些参数,这就是和正常的算法不同之处。

Binary labels

当数据更倾向于这种,分类型的,比如说只有两种情况,前者是点赞,后者是不点赞,?是没有看过。
在这里插入图片描述
而我们的操作也很简单,就是从线性模型转化为逻辑回归。
在这里插入图片描述

相同的cost function,也一致,替换成分类问题的即可:
在这里插入图片描述

Recommender Systems implementation

Mean normalization

这项技术主要用于那些?类型的数据,当这些电影已经被很多人看到过了,然后此时新增了一个用户,这个用户的品味(w和b,我们都不知道,一般是直接初始化为对应矩阵形状大小的0),但是对于其的label呢? 注意这里并不是x,x并不需要进行初始化,x的值取决于movie本身,所以x的值在之前就已经训练好了,那我们的movie全部由新生成的w和对应的x进行相乘的话,实际上也可以,但对于算法的计算并不是一个好的方法,我们一般采用的方法就是采用均值替代,也就是第二张图的方法:
在这里插入图片描述
在这里插入图片描述

tensorflow implementation

在这里插入图片描述
经典的Auto Diff 思想(也可以叫做Auto Grad思想一样的)

Find related items

由于我们的x的解释性很差,因为这些特征都是他根据梯度计算出来的,并不是我们提前设定的,所以我们往往并不知道这些x的具体的含义是什么:

在这里插入图片描述
我们这边采用的做法就是,对于这个分类选定一个最为确定的电影,或者几组,然后我们是知道这个对应的电影他的x的值的,然后对之后别的电影与这些已知分组(或者就是人工分好组的)的电影进行x求取相似性,最后就能划分好这些分组。

Limitations of Collaborative Filtering


协同过滤的缺陷:

  1. 冷启动(如何评估那些很少有用户评估过的商品 评估商品很少的用户(他的w和b 很少训练)如何向他进行推荐)
  2. 如何应用和项目(电影)和用户的额外的信息,加入推荐系统,因为每个人比如相同地域的人,可能有比较相同的偏好之类的这种额外的信息。

Content-based Filtering

Content-based filtering algorithm

之前介绍的都是以协同过滤为导向的推荐系统计算方式,而这种方式的缺点上面也进行了相关的介绍了,所以这边进而提出更为有效的方法,基于内容的过滤算法。

然后这边进行小的总结:

  1. 协同过滤:推荐的items取决于和你有差不多的相关items评价的投票
  2. 内容过滤:推荐的items取决于和你有差不多的特征和和你在 items上有差不太多的品味的投票

然后对于内容过滤算法,我们需要收集的不仅仅是之前的投票,还有用户的特征:
在这里插入图片描述
这边是把收集的x分成两个部分:

  1. 用户特征(xu)
  2. items特征(xm)

而这两个特征的数目多少是不重要的,往往前者取决于数据分析的用户画像,后者才是投票打分得到的数据。

得到这些特征之后,我们需要转向
在这里插入图片描述
我们会将xu 和 xm 进行FC多层连接,最后弄成特征维度度相同的,然后进行dot-preduction。

在这里插入图片描述
然后就得到了我们新的值,然后自然是返回去更新那些值,至于判断相似性,也还是一样的公式,这边就不进行重复介绍了:
在这里插入图片描述
代码理解:
在这里插入图片描述

Recommending from a large catalogue

而如果是一个看电影的网站上,我们想要进行推荐,但其中的电影却有着成千上万个,这每一次都进行访问是很不实际的。

所以我们一般把推荐的步骤进行简化成2步:
在这里插入图片描述
第一步就是进行检索,换句话来说就是,减少搜索的集合,比如上面的步骤:

  1. 挑选大量合理的items
    1. 根据最近该用户看过的电影中,寻找10部最相似的电影(这是可以由服务器提前进行计算的。)
    2. 最近看过的3种题材中,分别最火的10部电影
    3. 20部最近最火的电影
  2. 上面挑选出来的电影取并集,也就是集合去重,然后我们拿这个集合作为他能从中挑选的电影,进行下面的ranking(也可以理解成fine-tune)
    在这里插入图片描述
    第二步当中才是进行计算的过程,而上面第一步的检索,我们实际上,那些选择,都是提前计算得到的,而这一步微调就不行了,用户之间的相关性倒是可以提前算好,但是movie之间的确实需要要用的时候进行运算,但是计算的速度已经大大提升。

Principal Component Analysis(现在用处很少)

对于PCA降维来说,现在的应用已经非常之少了,一般的应用主要就是应用到可视化当中,这边只进行简略的介绍:

在这里插入图片描述
最小化相关的垂直距离。

代码实现:
在这里插入图片描述

Week3

Reinforcement Learning

基本的模型思路:
在这里插入图片描述
首先就是机器agent会先从周围环境当中得到一个state(代表的是环境的state,比如自己所处于的位置之类的信息),然后agent会进行判断Π,得到一个action,然后产生对环境产生影响,环境产生印象之后,会返回一个reward给agent用于评估此次行动的优劣。

在这里插入图片描述
基本的网络结构:
在这里插入图片描述
这边先介绍一下每一个函数和参数的意思是什么:

  1. s:代表的是当前的state,状态信息
  2. a:代表的是下一步的行动action是什么
  3. Q(state,a):代表的是在当前的state的位置下,选择了a这个action,之后最大的reward是多少(贝尔曼方程定义的)
    在这里插入图片描述
  4. γ:就是一个常数,这个值大,代表他更在意未来的收获,小就是眼前的利益。
  5. R(s):就是处于当前位置s的reward,一般情况下我们会把胜利设为100(较为大的正数),失败设置为(负值),其余情况设置为0。

然后就可以反过来介绍上面的网络模型,这个网络模型用来计算的是Q(),我们拿这个来替代Q函数,什么意思呢,就是输入(s和a),然后会输出一个Q(),作为我们的y,也即Q变成了这个神经网络,有什么用?见下:
在这里插入图片描述

在这里插入图片描述
然后计算就有:
在这里插入图片描述

于是就可以进行梯度下降了

注意fwb需要用到Q,y也需要使用到Q,也就是都需要用到我们的神经网络的计算,但是也会让这个越减越少。

或者换种说法,上面的Q的计算都换成神经网络计算即可,然后我们用贝尔曼方程计算出来的值,当作是真实的标签

在这里插入图片描述
这边的Q需要使用神经网络进行计算

然后直接采用:
在这里插入图片描述
又会得到另一个y。

此时两个y作均方误差,也就是上面的梯度下降了。

batch and soft-update

直接给两张图,由于都十分好理解:
在这里插入图片描述
在这里插入图片描述
注意看图之间的差别,现代深度学习一般都采用batch训练法,而不是一次性输入所有数据进行训练。

在这里插入图片描述

软更新,现在用的也有点少,但是碰到问题的时候需要注意这个东西存在,以此帮助我们解决问题。

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

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

相关文章

LeetCode Hot100 114.二叉树展开为链表

题目&#xff1a; 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…

力扣114. 二叉树展开为链表(java,用树模拟链表)

Problem: 114. 二叉树展开为链表 文章目录 题目描述思路解题方法复杂度Code 题目描述 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 1.展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左…

C/C++ 通过SQLiteSDK增删改查

SQLite&#xff0c;作为一款嵌入式关系型数据库管理系统&#xff0c;一直以其轻量级、零配置以及跨平台等特性而备受青睐。不同于传统的数据库系统&#xff0c;SQLite是一个库&#xff0c;直接与应用程序一同编译和链接&#xff0c;无需单独的数据库服务器进程&#xff0c;实现…

FFmpeg命令分隔视频

有一个视频如a.mp4&#xff0c;此视频采用帧率为30生成&#xff0c;共有299帧&#xff0c;这里通过FFmpeg命令分隔成1秒一个个的小视频&#xff0c;即每个小视频帧数为30帧。 用到的FFmpeg参数如下所示&#xff1a; (1).-i:指定输入视频文件的名称&#xff1b; (2).-c:指…

BUUCTF [MRCTF2020]Ez_bypass 1

题目环境&#xff1a;F12查看源代码 I put something in F12 for you include flag.php; $flagMRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}; if(isset($_GET[gg])&&isset($_GET[id])) { $id$_GET[id]; $gg$_GET[gg]; if (md5($id) md5($gg) && $id ! $gg) { …

Node.js下载安装及配置镜像源

一、进入官网地址下载安装包 https://nodejs.org/dist 选择对应你系统的Node.js版本 这里我选择的是Windows系统、64位 二、安装程序 &#xff08;1&#xff09;下载完成后&#xff0c;双击安装包&#xff0c;开始安装Node.js (2)直接点【Next】按钮&#xff0c;此处可根据…

终于来了,Runway gen2 制作AI视频的全功能超详细使用教程

最近有好几个学员私信我们&#xff0c;让我出一期Runway完整的使用教程&#xff0c;刚好11月Runway对外发布运动涂笔等新功能&#xff0c;那么今天就给大家安排一期全功能&#xff0c;超详细的从Gen1到Gen2的使用教程。 Runway 是国外一家在线视频剪辑制作网站&#xff0c;作为…

el-uploader同一文件无法上传问题

在上传成功和失败的回调方法中&#xff0c;吊用一下clearFiles方法。 this.$refs.upload.clearFiles();

7、独立按键控制LED状态

按键的抖动 对于机械开关&#xff0c;当机械触点断开、闭合时&#xff0c;由于机械触点的弹性作用&#xff0c;一个开关在闭合时不回马上稳定地接通&#xff0c;在断开时也不会一下子断开&#xff0c;所以在开关闭合及断开的瞬间会伴随一连串的抖动 #include <REGX52.H…

C++知识点总结(7):玩转高精度除法

一、复习高低精度 一个数分为两种类型&#xff1a; 1. 高精度数&#xff0c;即一个长度特别长的数&#xff0c;使用 long long 也无法存储的一类数字。 2. 低精度数&#xff0c;即一个普通的数&#xff0c;可以使用 long long 来存储。 由于高精度除法比较简单&#xff0c;…

Android修行手册-ViewPager定制页面切换以及实现原理剖析

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

PaddleOCR学习笔记

Paddle 功能特性 PP-OCR系列模型列表 https://github.com/PaddlePaddle/PaddleOCR#%EF%B8%8F-pp-ocr%E7%B3%BB%E5%88%97%E6%A8%A1%E5%9E%8B%E5%88%97%E8%A1%A8%E6%9B%B4%E6%96%B0%E4%B8%AD PP-OCR系列模型列表&#xff08;V4&#xff0c;2023年8月1日更新&#xff09; 配置文…

我叫:希尔排序【JAVA】

1.我兄弟存在的问题 2.毛遂自荐 希尔排序提希尔(Donald Shell)于1959年提出的一种排序算法。 希尔排序&#xff0c;也称递减增量排序算法&#xff0c;是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的&…

串口虚拟化工具

串口虚拟工具(Configure Virtual Serial Port Driver v7.2) 可以虚拟化串口 串口成对添加&#xff0c;添加之后可以在设备管理器中查看 链接&#xff1a;https://pan.baidu.com/s/1WE9c28MEoSEY7fGhy4kjag 提取码&#xff1a;yahn DebugTool-v.16 作用&#xff1a;可以检验…

Linux踩坑:arm下gcc编译添加 -Ox 优化后,程序无法正常运行

arm下gcc编译添加 -Ox 优化后&#xff0c;程序无法正常运行 一、问题描述 今天学习正点原子的阿尔法开发板裸机开发的时候&#xff0c;遇到了一个问题&#xff0c;在没有使用 -Ox 优化的时候&#xff0c;编译出来的程序能够正常运行&#xff0c;但是添加了-Ox之后&#xff0c…

思维模型 心里摆效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。情绪受外界影响。 1心里摆效应的应用 1.1 心理摆效应在管理团队中的应用 谷歌公司是一家以创新和创造力著称的科技公司&#xff0c;其“20%时间”政策是该公司管理团队的一个经典案例。该…

面试必问:如何快速定位BUG?BUG定位技巧及N板斧!

01 定位问题的重要性 很多测试人员可能会说&#xff0c;我的职责就是找到bug&#xff0c;至于找原因并修复&#xff0c;那是开发的事情&#xff0c;关我什么事&#xff1f; 好&#xff0c;我的回答是&#xff0c;如果您只想做一个测试人员最基本最本分的事情&#xff0c;那么可…

Arduio开发STM32所面临的风险

据说micro_ros用到了arduino,然后用arduino搞stm32需要用到这个Arduino STM32的东西&#xff0c;然后这里申明了&#xff1a;这些代码没有经过严格测试&#xff0c;如果是向心脏起搏器&#xff0c;自动驾驶这样要求严格的的情况下&#xff0c;这个东西不能保证100%不发生问题&a…

Redis实战篇(一)短信登录

Redis实战篇&#xff08;一&#xff09;短信登录 1.1、导入黑马点评项目 1.1.1 、导入SQL 1.1.2、有关当前模型 手机或者app端发起请求&#xff0c;请求我们的nginx服务器&#xff0c;nginx基于七层模型走的事HTTP协议&#xff0c;可以实现基于Lua直接绕开tomcat访问redis&a…

《尚品甄选》:后台系统——结合redis实现用户登录

文章目录 一、统一结果实体类二、统一异常处理三、登录功能实现四、CORS解决跨域五、图片验证码六、登录校验功能实现6.1 拦截器开发6.2 拦截器注册 七、ThreadLocal 要求&#xff1a; 用户输入正确的用户名、密码以及验证码&#xff0c;点击登录可以跳转到后台界面。未登录的用…