首页 > 其他分享 >七月在线公开课笔记-十四-

七月在线公开课笔记-十四-

时间:2024-10-23 18:33:00浏览次数:1  
标签:这个 在线 一个 笔记 公开课 就是说 然后 我们 其实

七月在线公开课笔记(十四)

1447-七月在线-机器学习集训营15期 - P6:03-图像与文本基础 - 程序员技术手札 - BV1ASste6EuZ

我好呃。

各位同学大家晚上好,然后我们今天呢就给大家讲解,我们的文本和图像基础啊,嗯这个呢就是很多同学比较关心,因为我们现在很多的一个呃岗位呢,上网工程师的岗位呢都是跟要不跟文本相关,要不就跟图像相关对吧。

所以说很多同学在嗯,就是说也是呃,非常建议,可以提前把我们这节课给好好学习一下,呃我们现在一个就业啊,就是说算法工程师对吧,我们的算法工程师,算法它里面是分方向的,不是单纯的就是算法工程师。

我们在上节课,其实上次直播也就是前两天直播的时候,我们也说了啊,因为我们具体任务它是分任务的,所以说这个地方我们的算法呢,也是分具体的一些方向,AP搜索额推荐系统,还有我们的搜索,还有我们的CV。

还有这种结构化的,不同类型的一个算法工程师,他的一个要求的技能是不一样的,所以说我们在学习的时候。

你肯定是要分专分方向的进行学习的,我们首先呢给大家看一看,我们今天所讲的这个啊,我们今天的内容呢分为四部分,第一部分呢是我们的一个数据的类型的介绍,然后第二个部分呢,其实在上节课我们也给大家介绍了。

然然后呢我们这个地方呢再给大家介绍一下,然后第二部分呢做一个文本处,文本数据处理的一个基础,第三部分是图像处理,数据处理的一个基础,然后第四部分是我们的实践案例,好我们首先来看第一部分数据类型呃。

我们今天的课程呢就主要是给大家嗯,讲这些具体的一些呃,就是说知识点啊,然后有一些具搭配一些具体的代码,然后我们的PPT呢可能会稍微简单一些,我们的具体的一个数据呢。

其实在我们在上节课上次直播时候给大家说了,我们的具体的一个问题,以它的一个其实跟我们的数据相关的,我们有这种结构化的数据,半结构化的数据和非结构化的数据,那么在这个地方呢,我们具体的一个数据集呢。

它的一个类型其实是跟我们的任务强相关的,一般而言我们在做一个呃任务的时候呢,首先是把它划分成结构化的数据和,非结构化的数据,结构化的数据就是表格类型的,非结构化的数据,就是不适合这种表格类型的嗯。

结构化的数据就是这种啊,就是说你可以用这种pandas的库,来进行很好的读取的对吧,我们在之前的课程也给大家讲了,我们具体的这个pandas的一些基础操作,然后呢。

我们的一个相当于是嗯这个嗯非结构化的数据,文本图像视频,文本图像视频好,这些呢都是在我们的,就是嗯他的一个非结构化的数据,那么这个地方呢,我们今天给大家讲这个文本或图像啊,当然这个视频呢。

其实它就是我们的一个多帧图像所组所组成的,那么如果是将我们的一个图像,加上我们的一个音频对吧,AUDIO就等于我们的视频等于video对吧,所以说这个视频呢从两部分啊,一个是我们的图像。

一个是我们的一个音频,那么这个地方呢就需要大家可以思考一点,提前思考一下,就是说我们在做一个分类任务的时候,在做分类,这种时候图片分类和文本分类有什么异同点吗,图片分类和E呃。

文本分类它其实都是分类任务,但是呢它的拥有的一个具体的一个数据,是不一样的,那么接下来我们的一个具体的一个嗯,就是嗯所产出的一个模型啊,以及我们的侧重点就不一样对吧,第二个文本分类和租房热度预测。

它有什么异同点,这个做房热度预测,就是我们上次直播给大家讲的这个,two sigma的一个嗯房屋热度预测,那么文本分类,它是一个典型的一个非结构化的数据,我们讲的住房热度预测,它是一个结构化的数据。

所以说这两个虽然说都是分类任务,但是它一个是非结构化的数据,一个是结构化的数据,自然它的一个解决方法也不一样,所以说呢我们在遇到一个问题之后呢,首先拿到我们的一个具体的一个嗯问题,然后就看他是什么数据。

然后就可以找到他具体的一些方法了,好那么我们就开始先看我们的文本,数据处理,对于文本而言,就是说在我们的英文里面,它叫natural language processing,简称ARP嗯。

自然语言处理啊,自然语言它这个地方的一个语言呢不是任何的,不是编程语言,它是一个自然的语言,自然语言就是说我们的一个人与人之间沟通的,这种语言,就是我们的自然语言,就是自然场景下的嗯,或者说英文。

或者说任何人与人之间沟通的这种啊,就是自然语言,那么我们的一个在日常生活中,我们写代码,这种Python,我们的C加加,我们的c#,其实它都是编程语言,它跟自然语言是不一样的。

编程语言它是有规定的一个语法,你不按照他的语法写,它就会错误,但是自然语言它是不会的啊,自然语言就是说如果老师在发音的上面,或者说说错了某些单词,其实不影响主体内容对吧。

所以说自然语言其实它是非常难的一件事情,也被称作叫做人工智能技术的皇冠啊,这是非常难的一件事情,那么咳咳咳,在我们的这个非结构化的数据集里面呢,文本是非常常见的非常常见的,那么在这个地方呢。

我们的互联网上面的一个具体的一个,80%以上的一个信息,都是由文本给出来的,就是说我们去嗯,你去聊天啊,或者说在互联网上冲浪,其实很多的一些具体的一个数据,一些信息啊,都是由我们的一个文本所给出来的。

对于我们的文本呢,一个算法工程师,他其实嗯基本基本任务啊,或者说基础的时候呢,都是做一些语言理解的任务,语言理解就是NIU语言理解能力,就是说我们给定一个文本,能不能理解出这个文本中间的一个核心的一个。

关键点,这是第一个第一内容,第二内容呢自然语言生成,这个地方的一个生成是前者,U呢是一个understanding,对吧,庞德斯登顶U呢,呃这个地方的G呢就是generation。

生成生成就是说我们能不能给定一个文本,你去产生它的回答,或者说你知道这含义的情况下,你能够组织这个语言,就是文本生成对吧,这个呢其实机器人很难有这个生成任务,生成的能力的。

因为机器它是没有这种逻辑思考的对吧,在我们的大部分场景下,我们的一些任务呢都是这种NLU的LU的,那么我们在这个自然语言处理,这里面到底有哪些任务呢,其实嗯我们待会儿会给大家介绍啊,嗯自然语言处理呢。

其实它的一个难度是非常大的,嗯在我们的日常生活中呢,你会看到很多的一些bad kiss啊,就是说这种错立我们看这个啊,就是说一个一男一女在进行相亲的时候,然后男生就发了他的一个名字叫普通对吧。

然后让女生给误会了,然后就是嗯把他拉黑了对吧,其实这个男生他就是叫普通对吧,女生就觉得他是呃,他以为就是说他说自己的名字很普通对吧,然后呢这个地方我们再看这个例子,就是说我们的一个具体的一个文本。

在进行嗯理解的时候呢,它在不同的句子里面,它的一个含义是存在不同的,比如说我们的一个有一个新闻,德国最大连锁百货进入破产,然后呢微博他在进行嗯,就是说识别的时候呢。

大家就看哎这个最德国最大连锁百货这个地方,他在做一个判断的时候,就是认为大连的用户都在关注这个新闻对吧,其实这个并不是说,这个地方并不是一个城市对吧,那只不过这两个单词把它组合到一起。

就变成了这样一个情况,嗯那么这个地方其实我们第一次看到这个例子,觉得哎微博的技术是不是很难啊,嗯是的啊,就是我有好多同学之前在微博实习啊,以及工作微博,他们在做一个自然语言理解的时候。

很多时候都没有上模型,都是人工去增加这些关键词,如果去人工去用城市的关键词做一个匹配,就很容易匹配成这种情况对吧,他没有做分词,在我们的一个自然语言的场景下呢,其实它是非常难的一件事情。

因为语言它是一个没有任何规律的,自然语言是没有任何规律的,而且是错综复杂的,语言是可以开放的,它是非常开放的,可以进行组合得到新的单词,这个呢就是如果是英文呢,其实更更严重一些。

我们在英文的一个每年度的牛津词典里面呢,它都它都会新增一些单词,就是我们的一个英文的单词,它是由我们的一个英文的字母所组成的单词,但是呢对于我们的中文而言,其实中文也会出现新词对吧。

我们在今年或者说去年都每年都会在产生一些,互联网上的一些新的单词对吧,所以说这个地方我们的一个机器,他想要不断的去理解这些新的单词,那么他就需要具备这种持续学习的能力。

好语言呢它在有一个上下文的关系的情况下,以及有环境知识的情况下,它的含义是不一样的,就是说一个单词在有上下文的情况下,有环境的情况下,它的含义也是不一样的,好,所以说自然语言处理其实是非常难的一件事情。

在我们的自然语言处理里面呢,我们有到底有哪些常见的任务呢,到底有哪些常见的任务呢,就是说我们常见的啊就是有这个垃圾邮件识别,情感识别和意图识别,这个就是我们的一个基本上,就是一个文本分类的任务。

聊天机器人和智能客服,在我们的之后的课程可能会讲到,其实他是一个对话的任务,语音识别和语种识别,其实这是类似于我们的一个语音相关的,一些任务,机器翻译和魔幻生成,这是其实是一种生成的任务好。

那么在这个里面呢,我们在前面三类就是一个NLU的一个任务,后面一类呢这个是一个n lg的任务,因为因为他是有一个生成的啊,有生成的,那么有同学可能还不太理解,这个地方的NLU和NNG它到底有什么区别。

这个AIU呢,它只关注我们如何理解我们的一个文本,那么在这个地方呢,我们基本上你可以用这样一个公式来白起,我们输入一个文本,然后把它做一个类别的分类,这个就是我们的一个NIU的任务。

lg呢就是说我们输入一个文本,我们试图要产生一个新的文本,这个新的文本和我们的一个原始的文本,是不相同的,或者说是不同不同语言下面的,这样你就可以理解对吧,我们的AIU呢基本上是一个降维的过程。

但是lg呢其实它不是一个单纯的降维的过程,在我们的LP里面呢,我们有两种实践方法啊,就是说传统的机器学习方法,以及我们的这个具体的一个嗯,基于我们的一个深度学习的方法,那么如果是用深度学习的方法呢。

那么自然而然他就是嗯,就是不需要有很多的特征工程,只需要我们把数据集给它处理好就行好,那么我们在做一个文本处理的时候呢,其实这个地方就有一些小小的一些细节,首先呢对于文本而言啊,我们的不同语言下的文。

他的文本,比如说我们的中文文本和我们的英文文本对吧,它就存在我们的一些区别,对于中文而言,我们是没有这种我们的字,我们的句子是由我们的单词所组成的,每个单词又是由我们的字所组成的。

那么我们在这个英文里面,英文就是它的一个句子里面,就是我们的一些一个单词,这个呢就是有一个很典型的区别,就是说对于中文而言,我们如果想要识别到单词的话,我们是需要做一个分词对吧。

但是呢对于我们的一个英文而言,其实我们不需要做分词,这个地方呢我们如果是做一个分词,或者说把它划分到词源,我们一般情况下把它叫做一个token nizer,这个token ize。

或者说token ize这样一个操作,就是把它做一个分词,当然我们在这个文本里面,其实还有一些其他的一些基础知识,比如我们在文本里面有这种形容词,有这种单词的一个词性对吧。

这些呢都是在我们的一个自然语言处理的,一些基础的一些教程或者说课本里面都会讲到,那么如果我们嗯基本上这些啊,前面这些都是我们的一个文本的清洗,文本的预处理,然后后面这些比如我们的这个。

它就会包含到我们的一个句子记嗯,基于我们的句子或者说单词的一个理解,然后下面第三部分,这个呢就涉及到我们的一个句子,相似度的一个计算好,那么基本上就是说,如果你对这些AMP感兴趣呢。

你可以将这些具体一个单词,这个呢就是我们的一些具体的一些距离,计算公式,你直接在百度上搜索,就可以得到一些具体的一些嗯答案啊,都是有一些啊,或者说一些教程都非常方便,对于我们的文本而言。

其实在我们在进行建模的时候呢,是需要特殊对待的,需要特殊对待的,然后呢我们的一个具体的一个文本呢,它在进行特殊,就是说嗯为什么要特殊对待呢,因为我们的文本其实它本质就是一个list,这是第一个单词。

这是第二个单词,然后这是第三个单词等等等等,你这个这是一句话,然后这个地方我们的一个嗯,就是说这一句话里面,他的这个相当于是一个word对吧,这是一个word这个地方我们的一个list,它是不定长的。

不定长的,然后呢我们再进行嗯,就是是处理的时候,我们的模型其实是不能接受这种list的类型的,一个输入的对吧,我们在进行上节课嗯,在对这个to西格玛比赛嗯,那个数据集做处理的时候。

我们对于list类型的一个数据,我们其实很简单的统计了一下,它的一个具体的一个长度对吧,就是说直接提取一个特征,提取它的长度,我们没有做其他的操作对吧,因为这个地方如果做其他的操作。

就涉及到我们本节课的知识啊,我们就没有展开讲这个list,来做一个处理的时候呢,你可以提取它的一些特征,比如说你把这里面的每一个单词做一个编码,比如说我们提取一个特征,就是说是否,包含某个单词对吧。

如果是包含某个单词,我们就把它置为一,如果不包含某个单词,就质为零对吧,你可以相当于是人工去提取一些特征,这个都是可以的,但是呢这个地方需要注意的是,就是说我们一般情况下,这个文本呢它是不定长的。

它是不定长的,那么这个不定长呢,我们就是在做处理的时候,你是需要知道我们的一个具体,就很容易得到一个系数的数据,因为句子不定长的情况下,而且这个句子里面是有很多word的情况下。

那么这个具体的进行处理的时候,你如果都是做这种类似的特征,你得到的一个具体的数据呢就是非常稀疏的,当然对于文本的一个处理,你可以参考类别特征的编码,比如labor encoder。

或者说count in count encoder等等等等,这个是可以参考的好对在对于文本而言呢,其实这里面有非常多的一些知识啊,因为文本它的一个发展是非常非常完备的,这个呢就是我们传统的自然语言处理。

里面的一些具体的名词,比如我们的语法术啊,比如我们的word rank啊,我们的一些呃LDA呀,我们的一些具体的一些名词,在自然语言处理里面,其实就是说非常多,当然这个并不是说全部都需要大家掌握。

这个值得给大家看一下,在自传统自然语言处理里面,其实包含的知识点是非常多的,如果是跟我们的深度学习相关的,就是我们的基于深度学习的资源源处理呢,这里面就大部分是模型的构建,你比如说BT模型啊。

我们的xl net啊,或者说我们的transformer attention啊,或者说我们的CNN啊等等,那么在深度学习的一个自然语言处理里面,就比较关注于我们的模型搭建嗯。

以及我们的具体的一个数据的处理,然后这个部分有这个地方,有一个我们的一个LP的厂,就是比较全的任务的一个名词啊,比如说这种哦我们的NNER嗯,实体抽取啊,我们的这个文本翻译啊。

Machine transtranstranslation,如果你感兴趣的话呢,可以把这一部分的一些嗯具体的任务啊,可以在下下面在下课后呢,把我们的一个任务给大家了解一下,因为我们这个这节课。

只会把我们的自然语言处理和CV呢,大致给大家过一遍,基础不会给大家讲很深,那么我们在学习的时候呢,可以你可以先这样一个思考,就是说我们在进行一个嗯学习的时候呢,首先是看一看你的一个具体的一个嗯文本。

它能够在什么地方出现,也就是设想一下我们的日常生活中,哪些任务是跟我们的文本打交道的,嗯或者说你到底是想要学习哪一类文文本任务,或者说你在学习的过程中会遇到什么问题,你都可以提前来了解一下。

因为嗯我按照我的一个经验啊,就是很多初学者在学习机器学习的时候,如果你基础不好的话,你学NLP的一些具体的任务,会很难很难很难上手啊,嗯或者说你可能调试几天,都很难调试出这个代码,嗯那么在这个地方。

你就首先不要想着把我们刚才这两页的一些,知识点都全部学会,嗯对于初学者而言,你是绝对不可能学完的,所以说呢你要一定要弄清楚,你自己到底想学什么,然后再去聚焦到这个任务上面。

然后这个地方呢也对于NP任务呢,也有一个具体的一个公开课啊,嗯是斯坦福大学的一个cs嗯,224和cs22cs,224N和cs,2224U这两个课呢都是比较经典,而且每年都在更新的一个呃公开课。

如果你想要去面试AARP的算法工程师,这两个课一定要刷一下啊,就是看完因为很多的一些前沿的一些模型,在两个在在这两个公开课里面都有讲到好,那么我们再开始啊,对于我们的一个自然语言处理里面呢。

我们比较基础的LP,里面有我们的NLG和LU对吧,那么比较推荐大家先学一下LU,因为AU呢它是一般情况下的任务都比较简单,在NLU里面呢,我们比较推荐大家先学习一下文本分类。

文本分类呢这个跟我们的一个图像分类,其实本质一样啊,这个地方我们输入一个文本,我们需要输出一个具体的一个类比,这就是一个文本分类,在做文本分类的时候呢,其实文本分类有非常多的一些应用场景啊。

我们再翻到前面,比如我们的垃圾邮件识别对吧,输入一个邮件,我们判断它到底是不是垃圾邮件,我们情感识别输入一段文本,对他的情感做一个判断对吧,他的情感是正向的嗯,负向的或者说中立的意图识别。

就是说这个具体的一个文本,它包含是不是有什么意图,以及具体的一些关键词是什么对吧,都是可以从分类的角度来完成的,那么对于文本分类呢,它的一个完整的流程是呃,文本预处理特征提取。

文本表示以及分类器在这个地方呢,我们在做文本预处理的时候呢,我们的不同类型,不同语种的文本,它其实是需要做不同的一个预处理的,也就是我们比较典型的英文的,它是不需要做分词的,而中文是需要的好做预处理呢。

其实是需要将我们的一一个,也是需要将我们的一些文本里面的一些呃,就是说垃圾啊这种信息给它剔除掉嗯,比如这种嗯无效的信息啊,都是需要把它剔除掉的,那么这个呢可能是也是需要大家掌握一下。

正则表达式相关的一些啊,就是说知识呃,后面的这个特征提取和文本表示呢,其实是这样的,我们的原始的文本呢,它并不是说所有的文本都是有效的,我们是需要将文本里面有效的一些信息,给它提取出来。

并把它表征为我们的一个呃,机器学习模型能够识别的对吧,我们各位同学现在应该对机器学习的一些模型,应该有一定了解的,那么我们的机器学习模型,其实它本质很多情况下,都是只能输入我们的数值对吧。

所以说我们是需要把它转成我们的一个,具体的数值,好这个呢就是说我们特征提取,我们表示是将我们的文本处理为我们的模型,能够识别的格式,这文本预处理特嗯,特征提取和文本表示这个呢可以放在模型之外。

比如说我们这一部分我们用Python来做写,然后后面的分类器呢我们加一个x t boost,或者说加一个逻辑回归都行好,那么我们继续对于我们的文本而言呢,其实这个地方有一个非常关键的一个点。

就是我们对于文本其实有一个叫做AGRAM的,这个呃,就是说概念AGRAM呢,就是说我们是可以将我们的一个呃,它其实是一种语言模型啊,是一种基于统计方法的一种语言模型,它的一个操作呢。

就是说我们利用我们的一个滑动窗口,在这个窗口内的一个具体的一个呃数值,它的一个统计量,来统计我们具体的一个字符的频率啊,举一个非常简单的一个例子,就是我们的AGRAM在给定一个句子的情况下。

我们AGGRAM分别取值为123的情况下,我们输出的结果AGRAM取值为一的时候,其实本质就是this is a sentence,This is a sentence,每个单词每个单词分开。

这个呢又叫做unit gram,n gram取值为R的情况下,就是this is is a a sentence,这样一种取值对吧,这样一种情况,那么它就是一个AGRAM取值为R,它窗口为二。

我们叫做big gram,然后N个N取值为三,N取三的时候,就三个单词的时候,This is a is a sentence,这种的它叫又叫做一个TRIGRAM,好。

这个呢就是一个叫做我们的一个n gram,的一种语言模型啊,嗯他在做什么呢,ANGRAM的语言模型,其实本质是在统计两个单词组合的情况下的,就是说你可以理解把它组合成了一个新的单词。

这样呢其实是可以保留这个单词与单,词之间的一个次序好,那么对于文本做处理呢,其实有一个非常基础的知识呢,叫一个contractor,CONTRVECTOR呢,它是将我们的一个文本进行一个编码。

并并进行一个统计,它出现的次数好啊,那么这个地方呢,CONTROVECTOR它嗯又叫一个又叫做一个turn,Frequency,Term,Frequency,这个term就是我们的一个单词的意思。

或者说这种嗯如果n n gram n取一的话,就是每每个单词N取二的情况下,就是两个单词的组合,这个叫做一个term,那么这个contractor,其实在我们的SKN里面也有具体的实现啊。

我们待会可以看一下,我们输入一个句子S嗯,contractor在做什么呢,它本质就是首先构建一个word index的一个词典,在这个词典里面呢,我们将这个this把它编码为一啊。

this is编码成零,然后呃is编码成1good2bad三对吧,类似的,然后呢将得到这个词典之后,这个词典其实本质就是,将我们的一个具体的一个单词编码成一个数值。

然后接下来我们是把它转换成这样一个向量,每个句子把它转换成这样一个向量,这个向量它是仍然是一个表格类型的,有行行的维度就是我们的一个样本样本,就是我们的一个句子列,就是我们的一个字段。

这个字段呢就是表明这个单词,它出现的一个频率,什么意思呢,在这个句子里面,我们包含的单词是this is good,This is good,那么在对应的位置大家都是取值为一的,那么在下面一个句子。

第二个句子this is bad,那么在这对应的位置,它就是取就是取值为一的这个地方的control vector呢,它是做一个次数的统计,就是说如果第一个句子是this is good,Good。

Good,Good good,假如说有五个good的情况下,那么这个地方我们的这个位置就是取值为五的,那么这个CONTROVECTOR这是他在做什么呢,Contributor,它本质就是统计。

我们这个单词在这个句子里面出现的一个次数,它有什么样一个作用呢,就是说不管你是多长的句子,我们都是把它转换到一个相同的一个维度,下面这个字段的这个维度,我们的度有多少列呢。

我们的列的个数是由我们的word index所决定的,它里面到包到底包含了多少个单词,也就是我们多少列,比如说这个地方我们是五个单词,我们的列就是五个对吧,如果我们是六个单词的情况下,我们就是六列。

那么这个地方不管你是任意长度的一个句子,都是可以把它转换成一个相同维度的一个vector,这个vector的一个维度,就是由我们这个所有单词的个数所决定的。

好我们刚才所讲的呢就是一个turn frequency,其实本质就是一个CONTACTOR,那么CONTROVECTOR其实本质在统计,它本质在统计什么呢,它本质在统计这个单词。

在这个句子里面出现的一个次数,但是呢这个单词在所有句子里面出现的次数,我们是没有考虑的对吧,那么这个地方我们就是给大家介绍一个叫做,I d f inverse document fency,立文档次评。

它是什么含义呢,就是说我们提取一个提出一个统计值,这个统计值呢去衡量一下,这个单词在所有句子里面出现的频率的倒数,相当于是我们的一个具体的分子,就是我们的所有句子的个数,二,分母呢。

就是这个单词在所有句子里面出现的一个次数,比如说这个地方,我们的this这个单词在所有的句子里面都出现了,且它的一个我们的一个句子,的个原始的个数就是二,那么这个地方this他的IDF就是log1。

log1是多少,就是零,就是表明这个地方我们的一个,这是在所有句子里面都出现过的,那么它的一个重要性对吧,他就是零了,所有人都有的对吧,那么你相当于是你没有,就是说没有独特性呢对吧。

你没有什么任何的信息量了,那么在这个地方end end呢,我们只在一个句子里面出现过的,那么它的一个取值就是log2,那么它就是非银的好,那么计算得到之后呢,其实本质就是我们在做这样一个计算。

我们将这个位置和这个位置进行相乘,15乘以log1,log1等于零,15乘log1等于零五分之一乘以log2,得到这个位置,零乘以log2等于零五分之一乘以log2,在这个位置对吧。

进行一个基于元素级别的一个相乘,然后得到了我们这样一个矩阵,这个矩阵里面呢,它就是一个TF和IDF进行相乘得到的,那么这个地方呢,我们把它简称叫做一个TFIDFTYF,那么TFIDF呢。

它在这个地方本质是由两部分所组成的,Term procreate,Term frequency,以及我们的inverse document frequency,前者是统计我们这个单词。

在这个文档里面的出现的次数,后者呢是统计一下这个单词在所有文档里面,出现的次数的一个导数,就相当于是它的稀缺性,前者是在这个文档里面的重要性,后者是在所有文档里面的稀缺性,两者进行相一样进行考虑啊。

一起进行考虑,就得到我们这样一个TFIDFGFIDF呢,在SKN里面也有具体的一个,直接就可以使用的啊,我们待会来看一下好,那么我们就继续,TFIDF分成两部分,一个是TF,一个是IDF。

那么这个计算的方法,我们待会也刚才也给大家讲了好,然后呢,我们就看一看这个具体的一些文本的,一些代码的实践,我们可以打开一下second nn的一个官网,然后呢在他的一个API的一个界面。

我们可以搜索得到一个CONTROVECTOR,我们在学习的时候啊,一定要将我们的一个呃课件的一些一些知识,如果是能够直接在一些Python的一些包里面,能够找到对应的一个实现,这样是最好的。

也就是说当你学了这个理论之后,然后再去到我们的一个库里面能够用起来,这样才是非常非常好的一种方法啊,嗯不然你学了知识之后,你不会用这个就哦非常糟糕了。

那么这个地方呢如果我们想要用content vector呢,我们是怎么进行使用的呢,我们from sk learn,点feature,Extraction,点text模块。

然后嗯import controvector,这个呢就是嗯我们在做一个具体的,CONTROVECTOR的一个操作啊,嗯我们的一个CONTROVECTOR呢,我们在进行一个具体的一个使用的时候呢。

嗯SKN啊,我们在上节课,其实嗯我们跳过了SKN啊,嗯SKN呢,它是呃就是说最为流行的机器学习的库嘛,然后呢这个地方contract,这个地方它是首字母大写的,就表明他是一个class,它是一个类。

这个类呢我们就是需要将它一个实例化,然后进行使用,我们实例化我们的contractor实例化,然后对它进行一个fit,fit呢就是我们用我们的crops这些文本来构建。

我们的word to index的一个词典,然后我们的transform呢,就是将我们的文本进行转换,转换的得到的就是这样一个矩阵,这个矩阵呢就是这样的啊。

this is the first document对吧,这个对应的位置就是它单词出现的一个频率,比如说这个第二个句子,This document is the second document。

这个地方document出现了两次,那么在这个地方是二对吧,正好我们的一个次序,在这个位置就是表明的是document对吧,那么其他的位置都是零,那么这个就是我们的一个contractor的一个。

基础的使用,那么CONTROVECTOR呢它不仅仅是这样来进行使用的,它还可以分非常方便的,可以将我们跟我们的AGRAM进行一个结合,在这个地方呢。

content creator它默认的一个AGRAM呢是一,默认的情况下是一,也就是统计单个单词的,如果我们设置agram range呢,我们可以把它设置为2~22。

那么这个地方就相当于是统计它的一个呃,两个单词的组合,那么我们得到的就是这样的,End this document,is first document这些单词的组合,那么他是怎么得到的呢。

我们来缩小一下啊,把这网页缩小一下,然后再来看一下啊,稍微缩小一点点,好,我们再来看啊,这个地方他怎么得到的啊,你看一下啊。

This is is the the first first document,就是这样滑动的得到的,然后你会发现它其实就是得到了我们的这些,相当于是在这个word index的词典里面。

它包含的是两个单词的组合,把它当做一个新的单词,那么在这个地方呢,我们ANGM的range呢其实是2~2,相当于是我们的n gram等于一等于二的情况,我们的这个地方的agram range呢。

其实可以设置的相当于是一个1~2,这样呢我们的AGRAM呢就是一二,就是它既包含一也包含二,这个其实是可以一起来进行提取的,就是说我也我既包含单个单词的组合,也包含两个单词的组合。

这样呢其实是相当于是我们的统计的一个统计,单词的窗口不同,那么在我们ANGMENT取值为不同的情况下,我们的word index的一个词典大小不一样,我们提取得到的一个数据的一个维度也不一样。

特别是我们的列,它的维度也不一样好那么这是我们的一个CONTACTOR,在SQL里面都是可以很方便的进行使用的,from s k n n n点feature extraction点TXT。

在我们的SKN点特征提取模块的TXT模块,然后import我们的control vector,好在这个模块里面呢,还有两个跟TFIDF相关的,一个是t f i d f transformer。

一个是t f i d f vector,那么这两个是分别有什么作用呢,我们先一步一步给大家讲啊,先看的呢是我们的一个tf i d f vector嗯,T f i d f vector。

它其实是一个一步到位的一个操作,我们的刚才也讲了,我们的TFIDF,其实它是由TF和IDF两部分所组成的对吧,TF就是我们的CONTROVECTOR对吧,那么假我们假如不想分开进行提取。

我们想要一步到位,在我们的这个库里面一步到位,提取它的一个TFIDF怎么做呢,就是from as as common the facture extraction。

点TXT模块import我们的t f i d t f i d f vector,然后对它进行实例化,然后进行fit transform,然后就可以得到我们这个单词的这个,这些句子的一个展示。

这个地方呢TFIDF它所包含的哪些,在废弃的时候,他在做什么呢,这个地方嗯就是说也是一些常见的一些面试点,就是说我们在做面试的时候嗯,可能会从这个具体的一些嗯语法呀,他在做什么啊,就是说考察。

你就是说具体对这个原理是不是有了解,GFIDF其实他首先要做一个tf contractor,那么它其实本质要构建一个word to index的这个东西,对吧,word to index的东西。

另一部分呢它计算一个DFDF,其实是计算好了就统计他统计好了就不变了,就相当于是我们提前算一次就不变了,所以说这个地方其实本质也要统计一下,这个单词在所有句子里面的例文档自评对吧。

其实这个地方的一个IDF,其实就是一个一乘以N的这样一个向量,这个N呢就是所有单词的个数,那么这个地方其实本质TFTF,IDF要做两件事啊,在feature部分,一个是构建watch index。

一个是计算IDF好,这个是TFIDF,他是一步到位的,那么在这个地方呢,还有一个t f i d f transformer嗯,它是基对我们的TFIDF进行一个转换,它怎么做转换的呢。

其实这个地方我来这样来看,给大家看一下,你就清楚了啊,其实tf i d f transformer,其实本质就是将我们的一个TF的一个turn,FGANCY的一个计算结果。

也就是我们的contractor的一个计算结果,然后进行一个进一步的转换来进一步转换,就是说基于我们的TF的一个结果,然后计算我们的一个IDF,然后做一个转换。

也就是说对我们的一个contractor的结果进行转换,这个就是我们的一个TFIDF纯transform,你可以这样理解,就是contractor,再加上tf i df transformer。

就等于tf i df vector对吧,也就是我们这个地方,这个加上我们的这个等于我们的,直接一步到位的tf i d vector好,这个就是我们在s kn里面的,具体的一个使用啊。

当然你可以自己下课后啊,可以直接使用一下啊,嗯这个地方有同学可能会有问题,就是说呃我们在进行举的一个例子的时候,这些例子里面其实本质都是我们的一个嗯,我们的一个英文的案例,英文的对吧。

那么我们在进行一个具体的一个操作的时候,如果我们是想要对中文来做一个处理,怎么做呢,如果是对中文怎么做呢,有没有同学知道的,有没有同学知道,如果这个地方我们想要对中文的一些文本,做一个处理。

我们怎么做的,就是说如果这个地方我们想要计算一些嗯,五个或者四个中文句子的一个嗯,Content vector,我们怎么做,有没有同学知道的,对嗯手机用户520906同学以及CLARK同学。

知不知道我们如果是对于中文而言,我们怎么做呢,如果是对于中文而言,这个地方其实如果你直接将中文输入进去嗯,我们的一个它是可能会报错,也有可能是没办法成功提取它的一个CONTROVECTOR。

这个地方呢我们的一个英文,它是根据我们的一个空格来分隔,得到我们的不同单词的,那么这个地方我们如果是对于中文而言,其实我们就是很难得到我们的具体的一些,相当于是这些嗯单词的。

我们是需要提前将我们的一些具体的一些文本,把它相当于是把它分割成,我们的这这样一种形式,我们的一个单词,一个中文的成语,或者说一个单词中间用一个空格进行分开,这样输入到我们的一个模型里面。

把它输入到CONTROVECTOR里面,我们的模型才能够成功的进行识别啊,才能够成功进行识别好,如果是对于中文而言,就是说你提前将我们的中文进行处理好,然后进在进行输入到我们的一个呃。

contractor里面就行,那么在我们的中文中文的一个处理里面呢,其实它的一个基础操作,就是说你如果把它做了一个分词之后,然后再把它用空格拼成拼接到一起,其他的操作啊都是完整,不做任何改变就可以好。

那么我们接下来讲一个基础的文本,文本分类的一个例子啊,我们来看一看嗯,这个例子呢主要是对于呃,我们的一些英文的文本做一个分类,就是有一些文本呢是啊一个虚假的文本,有一些文本呢是这个真实的文本。

就是本质是一个文本二分类的一个案例啊,读取进来的就是一个嗯有这些字段啊,Keyword,Location,Text or tarage,这个text呢就是我们需要建模的文本。

TARGAGE呢就是我们的一个标签,这个keyword和location啊,这两个字段我们可以把它丢弃丢弃掉啊,我们不用额,因为这个keyword和location,里面是包含了非常多的一些缺失的啊。

我们就不用这两个字段,只用这个text字段,我们在做一个具体的一个嗯,text字段的一个分析的时候呢,其实是可以做这样一个统计的,我们可以统计一下,标签为零和标签为一的这两类的文本。

它的一个具体的一个句子的一个嗯,就是说首先可以看一下这整体的类别的分布,就是我们可以将我们的targets进行一个value counts,我们嗯零类的一个样本是4342个,一类的样本是3270一个。

这是我们的两类样本,它的一个具体类别分布,那么我们还可以呃做一个具体的一个key,word的一个嗯展示,这个keyword就是我们的原始数据集里面的keyword列,然后这是原始的数据集。

它所给的一个keyword啊,我们在使用的时候,我们不做具体的使用,那么我们在做一个处理的时候呢,其实我们是可以将我们的一个在location列,我们是可以将它它里面的一些缩写呢,进行一个转换。

这个地方呢,其实location那个,它其实本质就是我们的一些具体地理位置,的一个缩写啊,那么这个就是我们在做预处理的时候,可以将我们的一些文本它的一些缩写符啊,嗯或者说它的一些具体的一些位置啊。

把它做一个转换好,那我们可以发现大部分的文本呢,都是发发布在USA啊,当然也有一些其实不是在USA的本土好,那么我们接下来该做什么呢,我们接下来就主要对我们的文本做处理,对于文本做处理呢。

我们首先嗯是需要将我们的文本,可能是需要把它做一个转统一,把它转成小写,然后剔除我们的文本的噪音,然后把它做一个分词,然后把它做一个具体的一个形容词的剔除,当然了,我们或许也可以做我们的一个词性的变换。

或者说词干的一个提取,词性的变化呢,就是说我们这个单词,其实它是有不同的一个时态的,单词是有不同的时态的对吧,比如我们的现在时态,过去时态或者说正在进行时的时态对吧,我们都可以把它进行一个统一统一。

这个相当于是一个磁性的一个体,然后呢我们的一个具体的一个形容词呢,它在进行,我们有这个good和better对吧,其实在这个地方,我们其实其实把它可以把它进行统一的转换,把它可以把它转换成相同的单词。

这样呢,嗯都是有助于我们的一个模型来进行建模的啊,现在于是将我们的word to index的一个空间,给它缩小了,在我们具体的一个清洗文本的时候呢,我们也可以考虑用正则表达式。

将我们的一个数据集里面的一些这种呃,UII啊,把它进行一个剔除掉,这些呢都是嗯我们的在做预处理的时候,可以做可以做的啊,好如果我们把文本把它处理好之后呢,就是非常规整的,都是小写的啊,都是小写的好。

然后呢我们也可以画一个云图,就是我们的一个嗯两类样本,它们分别就是说比较热门的一些单词是什么啊,比较热门的一些单词是什么,那么接下来呢我们可以做一个具体的一些token,token呢。

这个地方就稍微嗯有一点点细节啊,因为我们的token at的其实本质就是一个分,分词器或者说词源的提取器,我们的资源提取器呢,如果是按照不同的一些方法提取得到的,这个token呢。

其实它也是存在一定差异的啊,比如我们是用空格进行提取的,那么就是用空格进行分隔的,如果是用tree bank呢,它就会将具体的一些嗯,比如说or和not对吧,这些缩写把它分开。

这个地方其实就是基于我们的这个呃,单词的一个匹配啊,当然还有一些其他的啊,基于正则表达式方法的匹配啊,然后这些都是可以来做的,那么对于形容词的一个剔除呢,其实这个就非常方便了,因为在英文里面。

我们的这个stop words和我们的中文里面,我们的这stop stop words都是非常清晰的啊,Stop boards,形容词,我们是可以将我们的一个具体的一个stop wards,做一个筛选。

就是说如果这个具体的一个单词在stop words里面,我们就把它丢弃掉啊,如果不在stop words里面,我们就把它保留下来,那么我们对于我们的token token呢,我们可以把它做些规划。

就是做一个我们的一个磁性的提取,或者是词干的提取对吧,嗯我们的一个单词一个句子对吧,Fish cs wolves,无talked对吧,我们在做一个具体的一个提取的时候,其实就是把它具体的一个时态啊。

一些单复数啊,嗯以及它的嗯具体的一些词嗯,词性啊都把它剔除掉,然后把它还原成最原始的一个形态,当然啊这个地方这些这两个操作,steam号和lab啊,其实他做不做都行,做不做都行。

比较关键的就是把它转成大小写,然后把它分词就可以了,好,然后呢我们这个地方呢其实把它处理好之后呢,你也可以额这个地方的分子器呢,我们是用这个基于正则表达式的分词啊,你可以用其他的分子器,这个都是可以的。

提取完成之后呢,我们接下来就可以把它嗯就是说做一些特征啊,这个特征呢我们就是用CTRACTOR先来做一个操作,CTRACTOR呢我们对于我们的文本输入我们的文本,然后用CTRVECTOR进行转换。

其实它转换得到的就是一个嗯,零或者非零的这样一个具体的一个矩阵,当然如果我们想要用这个tf i d tf d f vector,其实也是很方便,我们设置一个我们的一个t f i d vector。

然后设置一下我们的agram range,然后这个地方呢我们可以设置取的参数,MDF和我们的max df,这个地方它是什么含义呢,这些含义在我们的这个具体的一个文档里面,其实都是有的对吧。

我们来看一下这个地方,其实都是讲的我们具体的文本,他的这些形态的含义啊,嗯命DF是什么意思,命DF就是说我们在进行一个嗯提取的时候,如果我们一些单词不满足我们的一个条件,我们可以把它进行一个剔除掉。

就是说有一些比较稀疏,就是出现次数比较少的一些单词,我们可以把它剔除掉,next df呢,就是说我们如果一些单词,它是出现次数比较多的对吧,嗯那么我们也可以把它考虑剔除掉。

这些都是我们在做t f i d f vector的时候,其实本质做一些嗯,我们的一些token级别的筛选,我们可以设置一下好,然后接下来呢我们就可以通嗯,用我们的一个机器学习的模型来进行一个训练。

然后进行一个验证的对吧,我们这个地方首先要用逻辑回归,然后对我们的一个数数据集进行一个礼盒,这个地方呢我们首先呃,这个地方是用cross valization score。

cross validation score呢,这个地方它其实就是一个交叉验证啊,交叉验证cross validation,这个呢其实我们在上节课也给大家讲了,Cos valization。

就是说我们把它划分成五折,然后起飞,其中一折呢当做我们验证集循环五次啊,这样循环五次,然后呢我们就得到了五份五份计算结果,五份计算结果,那么这个地方我们来看一看啊。

首先呢我们来计算得到在我们的一个CTRACTOR,一个输入的数据,然后通过五折交叉验证得到的我们的结果,这个分别是五,我们相当于是五五个,我们的验证集的一个F1score。

然后我们也可以使用我们的TFIDF,来做一个操作,TFIDF输入进去,然后仍然是五折,然后得到我们的结果,然后这个地方你会发现嗯,contract的结果,基本上是比TFIDFY的结果会好一些对吧。

这个是嗯可能大家没有想到的,就是说为什么这个TFIDF反而没有,没有这个嗯TF有效,嗯这个呢是存在的啊,特别是在一些文本分类里面,是存在这样的情况的,也就是说这个地方。

我们的IDF项对我们的最终的分类呢,是没有效果的啊,没有用的,或者说起反作用的,那么类似的,我们可以用这个贝叶斯,普斯贝叶斯的模型来做一个分类,我们的用普鲁斯贝叶斯,然后做一个五轴的交叉验证。

在我们的content vector的下面的一个,精度会稍微高一点啊,基本上是0。6左右,然后我们这个地方在我们的TFI点vector上面,精度仍然是稍微差一点啊。

比这个CONTROVECTOR会差一点,然后呢我们也可以用x g boost,x g boost这个地方定义我们的x g boost classifi,然后对我们的xg boost进行一个训练。

也是5日交叉验证,然后叉g boost的一个模型的一个结果,会是是在我们三个模型里面是最差的,对吧好,那么这个呢就是我们的一个AARP的一个,基础的一个代码,在这个地方呢,其实呃我想给大家表达。

表达的一个非常重要的一个信息呢,就是你可以看一下这三个模型,它的一个精度啊,这个地方我给大家写一下,我们的一个精度呢,其实就是嗯逻辑和规是零点呃,大致写一下0。56啊,然后呢我们的一个朴素贝叶斯是0。

63,然后呃我们的叉g boost是0。38对吧,这三个模型在相同输入的情况下,其实它的一个精度差异蛮大的,差异蛮大的,那么这个地方其实为什么这个x g boos,它的一个精度比这个前面两种差很多了。

x g boost不是很强大吗,对吧,我们在学到他的理论之后,x g boost有这种带有集成学习的一个数模型,它有带有这种什么呃我们的这个特征筛选啊,以及我们具体的一些呃,这个嗯模型继承的思路啊。

为什么它的精度反而差一些呢,这个呢就是我们的不同的机器学习的模型,其实它是存在一些偏好的,x g boost的这种树模型呢,它比较适合用在一些带有类别数据的场景下面。

这个类别数据呢就是指category的这种,类别类型的数据,但是呢我们在这个地方提取的一个卡,TF或或者说TFIDF这两类的一个特征,其实它大部分情况下都是数值的,它不是类别的,它都是一个数值的对吧。

那么在这个情况下,我们是比较适适合用线性模型,或者说我们的一个朴素PS来做一个分类的,所以说呢我们的不同的数据,在不遇到不同的一个呃模型的情况下,他的表现也不一样,那么在之之后的一个运用过程中啊。

或者说在之后的一个学习过程中,也希望各位同学从这样一个角度来做一个思考,就是说什么样的数据适合用什么样的模型好,我们稍微休息5分钟到九点钟,然后我们继续好不好,然后我们稍微休息一下啊,稍微休息一下。

好大家如果有问题呢,也可以在我们的一个具体的一个,聊天框里面打字,让我知道啊,好我们休息一下,好额怎么额,中文如果是嗯,有同学问中文,如果每个词分隔开也采用英文一样的处理方法,结果会怎么样呢。

结果就跟英文的一样啊,就是效果很好啊,每个字哦,你基于字级别的也行也行,这个其实也是可以的,就是也可以,就是不基于单词级别,基于字级别这个也行,这个也是可以的,嗯这个地方呢。

就是我这个地方还留了一个额外的一个额,具体的一个嗯代码啊,这个代码就稍微会有难度啊,我只大致给大家讲一下嗯,我们在做一个英文的一个啊对,不管是英文还是中文的一个文本做处理的时候。

其实是需要嗯做我们的一个单词或者文本的,一个相似度的一个度量,如果是做一个相似的相似度的一个度量,这个地方我们是可以有很多,这些相似度量的方法,比如我们可以度量一下,这个字符串与字符串的一个边际距离。

字符串与字符串的一个编辑距离啊,这个编辑距离,其实在我们的一些刷题的一些网站上面都有啊,编辑指令好,然后呢我们这个边界距离嗯,这个地方大家可以下去看,这个地方我们是直接呃,我们我们这个地方的边界距离。

我其实是可以再用这个edit distance来做啊,当然也可以统计一下两个句子,它共用单词的一个比例啊,共用单词的一个比例,当然也可以统计一下两个句子,它们之间在通过TFIDF转换之后。

它的一个具体的一个相似度啊,相似度就是直接把两个句子,通过一个TFIDF嗯,在一个具体的一个转换之后,然后通写他们的一个嗯,就是说嗯他的一个具体的一个相似度啊,这个相似度呢。

我们就是直接用一个dot来做一个嗯相似度,一个计算就行了,DOCH呢就是本质啊,这个地方我是为了做计算加速,用这个PYOR型来做一个嗯嗯GPU加速啊,就是做一个矩阵乘法,就是计算两个向量之间的一个。

具体的一个相似度,当然我们在做的时候呢,也可以用,不仅仅用TFIEF,也有其他的一些改进方法,就是BM25,就是基于TFDF的改进方法,也可以用BM25来做,都很多啊,做的方法很多。

好这个那我们就是说讲LP的部分,讲到这啊,就是说后面部分就是我们CV部分啊,AIP部分还有一个非常关键的概念,就是说我们是可以把这个单词,把它转成一个向量。

用what to director这种嗯词嵌入的方法来做嗯,那么这个呢在我们的之后的课程啊,我们的赛文老师和我们之后的老师呢,都会给大家详细的讲解啊,也不用担心好,然后如果各位同学提前改。

对我们的这个具体的一个嗯,案例比较感兴趣的话,你可以下去拿到我们这个代码好不好,可以看一看啊,主要的呢你可以嗯优先去掌握这个LP入门,这个LOTUBOOK和CV入门这个裸TEBOOK好。

我们接下来开始我们的CV部分啊,就是图像的这个部分嗯,对于图像而言,其实他的一个嗯就是说叫做计算机视觉,computer vision简称CV对吧,CV呢它是能。

它的目的呢是让我们的机器能够理解这个视频,或者理解我们的图像,并进行我们的一个具体,也就是说对这个呃视觉有一定的理解,那么这个地方呢计算机视觉呢,它其实这是一个非常大的一个呃领域啊。

我们在计算机视觉里面我们有这个额,就是说数字图像处理啊,数字图像理解啊这些具体的一些分支,我们在做一个具体的一个学习计算机视觉呢,首先要学我们的一个嗯就是说我们的数据,数字图像如何进行存储的。

以及数数字图像如何进行提取特征的,因为我们的一个图片啊,它其实本质就是一个矩阵,它其实本质就是一个矩阵,就是说一个match matrix啊,一个矩阵,我们的图片呢,它假如说是一个900×900像素的。

那么他就是拥有对吧,相当于是81万个具体的一个数值来表示的,我们在这个地方,就是说机器它本质只能是对我们的一个,具体的一个数据呢进行一个处理,它并不具备一个理解的一个过程啊,就是说在这个地方。

如果我们想要让我们的一个模型,拥有我们的一个理解的能力,这个地方我们就需要我们的一个具体一个,计算机呢能够理解我们的视觉,理解视觉的数据啊,好,那我们来看一看,对于我们的一个具体的一个计算机。

视觉的那一个任务呢,它其实的一个学习路径也是蛮复杂的,因为呃是呃也是一个比较大的一个学科啊,也是比较大的学科,那么如果是大家来进行学习呢,其实是可以按照这样一个步骤来进行学习啊,首先呢在第一阶段呢。

可以学习一下计算机视觉的基础,比如我们的一个数字图像处理啊,数字图像处理的一些基础啊,以及计算机视觉的基础,然后第二部分呢再看学习一下机器学习的基础,以及深度学习的基础,第三部分呢就学习一下。

以及具体应用,然后第四部分和第五,第五部分就是具体的一些深度学习的应用技巧,比如目标跟踪啊,语义语义分割啊等等等等,好如果各位同学先学习基础的话,就学习第一阶段和第二阶段的内容就行了。

我们在做一个图像的一个处理的时候呢,其实如果我们只是对一个图片提取它的特征呢,我们就是做一个图片级别的一个特征,提取image的一个feature extraction对吧,对图片进行一个提取特征。

这个地方的图片呢我们进行提取特征的时候呢,我们刚才也讲了,其实本质它就是一个矩阵是吧,如果是彩色图片是900×900乘三三,是三通道的意思,对于图片特征呢我们在进行提取的时候呢。

首先我们是需要根据特定的任务,提取它的一个特征的,因为图片它里面包含的数据是非常多的,我们在做一个特征提取的时候呢,你可以参考图像处理的一些领域知识,比如说图片的一些边缘信息呀。

以及图片的一些具体的一个嗯就是形状信息啊,这些都是可以来进行一个处理的,我们对于图像特征呢,我们可以提取它的一些底层特征,比如它的颜色信息啊,边缘信息啊,关键点信息啊,这些都是可以的。

嗯我们也可以提取它的一些高层特征,比如说CNN特征啊,我们的一些语义标签特征啊,当然也可以提取一些基于文件的特征,比如说文件的创建时间啊,以及文件的MD5啊,这些都是可以提取的好。

那么我们的一个具体的一个图片啊,它在运用的时候,或者说在应用的时候啊,其实是也是根据任务来进行驱动的,我们不同的任务呢它的一个具体完成的一个呃,就是说目标也是不一样的,我们常见的任务就是有这种呃。

分类分类就是我们的给定一个图片,我们输需要输出这个图片,它的一个具体就是主体的一个类型,主体的一个类型,那么这个地方我们还有一个,我们的一个具体的一个主体分类加定位,就是说把我们的这个主体的一个目标。

给它定位出来,我们的目标检测,相当于是把我们的这个图片里面的一些目标,它的一个类比,把它一把它识别出来,以及具体的位置,语义分割,是把这个具体的一个像素级别的进行分类,就是这些是背景,这些是狗。

这些是猫,这是狗对吧,我们常见的计算机视觉的里面的任务,就是由分类目标检测与分割这些所组成的,在这个地方呢,就是这些这个地方我们这一部分啊,下面这一部分就是基础任务,这些基础任务学好了之后呢。

你再去看一些嗯制计算机视觉的一些领域,任务就非常简单了,比如说这种行人虫检测raid任务,其实本质就是一个分类加检索红绿灯识别对吧,我们给定一个图片里面给定一个图片。

想让你识别出里面到底有没有红绿灯对吧,那么就是一个物体检测的任务,所以说你把这个基础的一些任务学好了,然后再去看一些具体的一些比较难的任务,就非常简单了,那么学习这个我们的一个自然呃。

学习这个嗯精神视觉,就不得不学习这个深度学习,你如果学习这个自然语言处理,你也不得不学习深度学习,因为现在在这个非结构化的数据集里面,深度学习的一个精度实在是太好了,深度学习呢在他其实有很多种分支啊。

深度学习这个地方的分支呢,我如果说的比较简单一点,就是它的具体有一些层的差异,层的差异啊,就是说具体的网络结构啊,这些层比较常见的层,我们有全连接层,有卷积层,还有我们的RN层这种循环神经网络。

我们在这个图片的这种数据下面呢,我们用卷积层比较适合用卷积神经网络,那么如果在文本的下面呢,我们就是用这种RN循环神经网络对吧好,那么我们在做一个学习的时候呢,我们不同的一个领域的任务。

其实它的一个侧重点也是不一样的啊,好深度学习其实是机器学习的分支,深度学习也是一种表征方法,然后这个地方具体如何提取特征,就是我们具体的每一层如何进行设计呢,我们是可以用我们的一个嗯。

不同的层来提取特征的,我们来看一个典型的一个例子啊,就是给定一个图片,我们需要识别出这个图片,这个地方输入的是人脸,我们是需要识别出这个人脸的一些,具体的一些类别对吧,那么这个地方我们在进行。

就是说不管是全连接网络,还是我们的一个卷积神经网络,它在进行不断的进行建模的时候,这是我们的输入input,这是我们的输出,Output,我们的输入的数据在不断进行一个计算,不断进行表征。

然后不断的一个计算之后,他其实在浅层计算得到的一个输出,是提取得到这个图片的一个边缘信息,然后逐步深入提取得这些我们的人的一些啊,相当于是这个鼻子啊,眼睛啊,嘴巴这些部位的信息。

然后再更深的相当于是提取到这些嗯,就是说比较相似的一些呃,由我们的一些鼻子,嘴巴它组合得到这些人脸信息,所以说深度学习,其实它是一种对特征进行表征的方法,不断进行进行一个表征。

这个地方我们的具体的特征提取的方法,你可以用全连接层,也可以用我们的一个卷积层,这个都是可以的,深度学习的一个特点,就是它是可以来自己提取特征的啊,就是说我们在做一个具体建模的时候。

我们不需要人工去提取特征,我们提取特征的方法是,放在我们的这个网络结构里面的,深度学习,它是需要根据不同的数据做不同的数据扩增,以及需要做特定的正则化方法的,在我们的之后课程呢我们也会展开讲。

给大家讲解好,然后呢对于我们的图片呢,我们给大家给大家看一个典型的案例啊,我们就给大家看一个,就是图片分类的一个案例啊,然后这个地方我们给大家讲一讲,嗯对于我们的一个图片分类的一个案例呢,我们其实是呃。

我首先呢给大家用深度学习的框架,给大家实现一下,然后呢也用这个机器学习的框架,也就是我们的SKN给大家实现一下啊,嗯这个地方呢就是说如果学习深度学习,其实是要学习深度学习的一些框架的。

deep learning的一个framework就是深度学习的框架,这些框架呢它其实就是做一些具体的一些网络,搭建的一些嗯就是说一些操作,以及我们现在机器上不是有GPU吗。

GPU呢我们自己去操作GPU其实是蛮复杂的,那么这些深度学习的框架呢就是很方便的嗯,帮助我们去操作这些GPU啊,我们现在学习深度学习的框架呢,主流的是PYTORCH和TENSORFLOW。

然后TENSORFLOW基于TENSORFLOW的有cares,cares呢,它是一个基于TENSORFLOW的一个高层的实现,我们这个代码呢是基于KOS来写的啊,是嗯chaos2,也就是基基于。

基本上是基于TENSORFLOW2来进行一个展开的,我们首先呢来我们这个地方的一个案例呢,就是一个MINNEST的一个分类,m list就是从0~9,然后是十个数值,我们做一个分类。

就相当于是手写数字啊,这是一个分类,我们首先呢读取我们的一个手写数字,这个地方cares点DATASET点,Eminist load data,读取我们的一个具体的一个图片。

它读取的是我们的训练部分和我们的测试部分,然后呢我们需要对我们的一个图片呢,把它做一个归一化,这个归一化呢我们的一个原始图片,它是以一个呃这个非浮点数啊,我们是需要把它转成浮点数,我们这个地方的图片呢。

一般情况下是在一个颜色空间内,就是0255的空间内,我们把它除以L5,就把它转到一个从01的一个空间内,这个呢其实也是必要做的一步嗯,为什么必要呢,因为我们的原始的X这个地方,X假如说是我们的图片。

它的一个取值范围不能太大,不能太大,也就是说这个地方的规划,其实本质就是我们在之前的课程给大家讲的,一个min max scanner对吧,Mean max mammax scanner。

其实本质在做这样一个操作,就是对我们的具体的一个数据集,把它规划到一个指定范围内好,那么我们接下来做什么呢,我们对我们的数据集呢,把它做一个增加一个维度,也就是说原始的数据集呢,它是一个我们的一个。

66万×25,28×28,这个是我们原始的维度,这个原始的维度呢就是6万,是我们的样本个数,样本数数据,五二十八乘28呢是我们的一个原始图片,它的一个尺寸,这个地方的一呢是我们的通道数。

通道数单通道就是表明它是一个灰度图,单通道就表明它是一个灰度图,好我们把我们的一个图片,把它转为一个6万×28乘,28×1的这样一个维度,我们的一个测试集呢仍然也是类似的啊,测试集的一个维度。

就是一个我们的一个1万×28乘,28×1的一个维度,这是我们样本数量好,然后呢,我们还需要对我们的一个标签做一个转换,标签呢这个地方其实chao unities to category。

其实这个操作其实本质就是在做一个one hot操作,把我们的原始的一个标签,把它转成这种one horse的一个形式,好然后接下来我们搭建一个模型啊,这个模型可能稍微有一点点复杂。

嗯我这个地方不会给大家展开讲啊,嗯这个是卷积神经网络的一个模型的搭建,我们只给大家看一下,就是说搭建一个网络模型其实是非常简单的,输入我们的一个模型啊,输入我们的数据,这个数据呢就是一个28乘上。

28×1的一个尺寸,然后呢我们构建几个卷积层啊,一个卷积层,两个卷积层的一个操作,两个卷积层分别设置,我们的卷积核的大小是多少,卷积核的个数是多少,我们的激活函数是什么,然后中间层有一个池化层卷积。

这是我们的convolution,2D是我们的卷积,这个你不用担心啊,在我们的之后的课程,我们的seven老师会给大家讲的啊,我们的max prin呢就是一个池化,对我们先给大家做一个感性的一个认识啊。

好我们用卷积层提取特征,然后进行磁化,磁化就是max spin,就是保留2×2的范围内里面的最大值,把它有效的信息保留下来,然后进行卷积,然后进行池化,然后一个flatten。

flatten就是把它从一个多维的情况,把它转为一个二,转成一个二维的情况,然后加一个dropout随机丢失,然后做一个全连接层,最终得到我们的一个类别个数,这个类别个数就是十,类别个数是十。

好我们来看一看这个纬度的变化,你就清楚了啊,我们的原始的一个输入的数据是一个28乘,28×1,然后通过一个卷积的操作之后,它的一个输出,这是它的一个我们的一个尺寸啊,尺寸从28×28。

把把它降低到26×26啊,卷积的操作其实是唯,就是说图片的长和宽的一个下降,卷积的操作其实本质是图片的长和宽和下降啊,也就是说我们的原始的输入是H乘W乘C,图片的长和宽,然后这个C呢是通道数。

通道数其实是上升的,通道数,32个对吧,32个,然后通过一个max pin之后,把两个范围内的一个图片的尺寸里面,提取它的最大值对吧,我们的维度继续下降对吧,我们通通道数是不变的。

然后再通过一个卷积维度继续下降,通道数上升,然后通过一个flatten,flatten就是把它的一个维度把它拉平了,拉平的就是5×5乘64,就等于1600,把它转成1600的,因为我们的一个全连接层。

它本质只能接收这种二维的一个输入,他去或者说在进行一个计算的时候,其实本质是用矩阵乘法实现的,那么它就就是一个二维的输入,权利阶层,其实本质就是接受这种一,就是一个vector的输入啊。

他不能接受这种矩阵的形式对吧,我们把它拉平,然后再把它通过一个全连接层,把它转到一个十位,这个十位就是我们最终的一个概率的输出,我们最终的类别个数是十,好那么我们这个地方深度学习的一个训练呢。

我们设置这个训练15轮,15呢,就是让让它在我们的数据集上迭代15次,然后我们可以看一下我们的一个模型,在训练集上的一个准确率,以及我们模型在验证集上的准确率对吧,然后我们训练到最后。

模型在训练集上的准确率是0。99,然后在验证集上的准确率也是0。99,也是0。99,好,这个地方呢,我们你如果是对这部分觉得有疑问的话,你就是说你可以大大可不不必焦虑啊,这部分其实是在我们之后的课程。

会给大家详细讲解,这个要我只是给大家初步讲解一下,我们搭建模型,然后进行训练,这是基于KOS的,然后呢,我们当然也可以用我们的一个SKN,来搭建一个卷积,是搭建一个全连接的一个网络啊。

我们这个地方是用s clan的一个neural network,然后从这个模块里面,import我们的一个MRPCLASSIF,这个地方的一个m r p classifier,就是一个全连接网络啊。

全连接网络,然后这个地方的全连接网络呢,它默认是有一个是就是说网络结构的啊,我们的网络结构它在进行搭建的时候呢,其实首先的就是我们有输入的一个维度,以及我们的一个输出的维度。

我们根据我们的一个输入的维度,和我们的输出的维度,就可以得到我们的一个具体的一个网络结构啊,这个地方其实是用我们的一个全连接网络,来做一个计算,然后呢SKN呢,其实你可以自己定义它的一个每层的一个。

就是说呃他的一个嗯就是嗯到底有多少层啊,以及具体的一些层的一些细节,当然这个地方我是没有没有直接手动,手动实现啊,直接是让它自动来进行一个推测,然后呢我们是进行一个score。

score呢就是进行一个预,就是打分了我们的一个feature呢,就是一个进行一个训练,然后呢我们的一个score呢,就完成一个具体的一个预测,当然啊这个地方我们的一个全连接网络。

它得到的基本得到的一个精度,是0。977711,然后他的一个精度应该是比卷积神经网络,低一些的对吧,它的一个具体的一个精度是低一些的好,然后呢我们当然也可以用这个呃rage classifi。

就是我们的一个线性模型,线性分类器,然后呢我们用线性分类器来进行一个训练,然后进行一个预测对吧,线性分类器的一个模型的一个精度是0。86,0。86对吧,然后这个地方我们的一个模型的一个精度。

是比全连接的一个模型的精度会更低一些对吧,你就可以很清楚的可以看到,我们的这个深度学习的一个模型,它的一个强大之处对吧,我们并没有做任何的操作,直接进行训练,就比我们的一个呃。

就是呃线性模型的一个精度高很多高很多好,然后呢我们再继续啊,对于我们的一个图片呢,其实我们也可以提取一些相关的一些特征啊,这个地方我们就展开给大家讲解一下,然后呢,嗯也给大家就是说打一下。

我们的计算机视觉的一些基础,对于图片而言,其实它原始呢其实是一个矩阵,我们的一个图片呢其实是本质是一个矩阵,这个矩阵呢就是一个H乘W乘C这边的长和宽,然后乘一个C,这个C就是一个china。

就是由这样的一个三通道的一个,如果这个地方我们是灰度图,那么这个地方呢一个C就是一对吧,其实本质就是一个三通道所组成的一个矩阵,那么对于一个图片而言,我们提怎么提取它的一些特征呢。

其实这个地方我们的一个图片呢,如果它的尺寸是900×900乘以三三通道,RGB3通道的情况下,那么这个地方,其实我们本质包含了多少个数值啊,900×900,80,1万乘三二百四十万个数值,240个W。

我们一个图片900×900像素,下面它拥有240个W的具体的数值对吧,那么这个地方其实它的维度是非常非常高的,那么在这个地方,我们如何提取这个具体的一个图片,的一个特征呢,这个地方这个问题就非常关键。

对于一个提取图片的特征呢,其实有很多种方法啊,我们这个地方一一给大家讲,首先呢是这个图片的一个哈希值,哈希值哈希值呢就是说对于一个图片而言呢,嗯我们是用一个哈希的方法。

来做一个具体的一个特征的一个提取哈,希这个哈希呢可能很多同学之前就已经知道啊,哈希呢其实本质有点像类似于这种hash table,相当于是我们把一个具体的一个数值,或者说一个取值。

把它映射到一个对应的范围内,一个比较典型的MD5,MD5呢,其实就是将一个文件把它转成一个字符串,一个文件的内容把它转成一个字符串对吧,如果两个文件的一个MD5它是字符串相同。

那么它的一个具体的内容就是相同的,那么这个地方的一个嗯image hash,我们的一个图片的哈希值也是类似于这种思路,它是将我们的一个图片的一个内容呢,把它进行一个缩放,图片的内容把它进行缩放。

比如说缩放到8×8的一个范围,然后呢,再根据我们的具体的像素的取值,是不是大于某个,比如说是不是大于128,跟他做一个比较,然后呢就可以得到一个true or force的一个矩阵。

这个矩阵呢每一个取值就是我们的对应的位置,是不是大于某个,就是说像素或者大于均值对吧,然后呢我们就本质就可以把一个图片把它降,把它转换到一个8×8的一个矩阵上面,零一的矩阵,那么这个零一的矩阵呢。

我们进一步可以把它转换成这种,16进制的字符串,把转换成16进制的字符串,那么就得到了我们的一个具体的一个哈希值,这个呢就是我们的一个突变哈希值的方法,那么这个图片哈希值呢。

其实它不同的哈希值的提取方法,它计算得到的哈希值也是不一样的,嗯比如说我们这个地方有这个嗯,orange hash和p hash和我们的d hash,其实它计算得到的一个字符串是不一样的啊。

嗯但是呢这个基本上是这样的,就是说如果两个图片它是相似的,那么它计算得到的哈希值也是相似的,嗯我们是可以做一个小小的一个实验,我们读取两张相比较相似的图片,然后分别计算它的一个对应的哈希值。

那么我们可以看到啊,这个地方三张图片,它的一个有很多的一些字符都是相似的对吧,我们的后半部分的这些字符都是相似的,那么就表明这两这三幅图片,其实它本质它的内容就有很多相似之处,那么有同学可能就会问到。

老师会不会存在两个图片,它的哈希值相同,但是它的内容不一样,是存在这种情况的,但是这种概率很小啊,概率很小,好我们继续,我们对于图片而言呢,其实我们还可以提取这个图片,它的一个具体的一个像素的。

一个嗯统计的一个信息啊,就是类似于这种颜色直方图的一种方法,我们对于我们图片呢可以提取它的一个,我们的一个图片原始,假如说它是一个三通道的RGB的,那么我们可以提取一下每个每个通道下面。

它具体颜色取值的一个直方图,这个直方图是什么含义呢,比如我们分别是RGB,在这个地方,就是说RGB分别取值为49的情况下,那对应像素点的个数,也就是说统计了一个出现次数的一个,直方图或者柱状图。

这个地方其实是一个柱状图啊,然后他为了画的比较好看,他是把它用连线连接起来的,那么这个地方其实它统计的是一个全局信息,也就是说它只是统计了这具体RGB像素点的一个,出现的一个次数,他没有考。

并不会考虑这个具体像素的位置,它是统一把这个图片的像素的取值,来作为一个统计,取值为49的像素分别是多少,取值为100的像素,RGB空间分别取值为100的像素,RGB分别是多少对吧,个是多少。

分别取值为150的,它是多少,所以这个地方颜色直方图呢,它是一种全局的特征,它是将图片的一个整体的一个信息,进行一个计算,然后统计了一下颜色的取值,那么这个地方的颜色直方图呢其实它是很好的。

可以很好的度量一下,两张图片在颜色空间下面是不是相似的,这个地方我们如果提取图片的一个颜色,直方图的一个信息呢,我们直接是读取一个CORE hits,就是直接用open CV这个库。

然后可以提取它的一个颜色直方图的一个信息,然后这个地方我们首先是将这个图片的一个,具体的信息呢,我把它首先是把它提取成这个灰度图的灰度图,就是说它默认嗯只有一个通道,所以说我们绘制得到的一个图片。

就是就是相面是只有一条曲线啊,然后呢我们可以看一下这两张图片,两张相似的图片,如果我们把它就是说分别提取它的一个颜色,直方图,你会发现他的一个及得到的一个直方图,其实是非常相似的,非常相似的对吧。

基本上这两个具体的一个曲线就是重合的,就是重合的,那么有同学可能就会问到老师,这个地方这两个曲线也不是说完全重合,那么我们怎么做判断呢,这个地方的一个判断其实是嗯,你可以直接是用这两个直方图。

它的一个嗯欧式距离就可以作为判断,这个地方我们其实本质得到了两个vector,vector1和vector2,我们本质做得到两个vector,在这两个vector类呢。

我们其实是直接计算一下它的一个距离就行了,对吧,其实这个地方是一个展示得到的结果,那么我们直接计算它的一个距离,就可以得到它的一个相,相当于是它的一个相似度,那么这个地方嗯。

颜色直方图它会不会也存在一个一个差,就是说它会不会存在它的一个具体一个缺点呢,其实呃颜色直方图,其实它也会存在它的一个具体的缺点,它的一个缺点就是说我们的一个图片,如果两张图片是比较相似的。

但是呢某一个部位,某一个位置发生了一个颜色的变化,那么这个地方的情况下,我们的具体的一个颜色直方图,它就会嗯就相当于是形态就发生了较大的变化,这个地方其实我们读取了两张比较相似的图片。

但是呢就是它整体你会发现啊,我们把图片放大一点,我们其实是有张图片,它的一个具体的颜色相当于是往,放大一点啊,你可以看一下,有一条也有一条图片的一个曲线,整体是往右偏了,为什么要往右偏呢。

因为它的一个具体的一个颜色,相当于是更加,相当于是这个地方是靠近255了对吧,靠近5255,应该是更加偏向于我们的白色对吧,所以说呢这个地方我们的一个具体的一个。

如果一个图片它的一个颜色发生了整体的变化,那么它的整体的一个额,就是说形态也是发生了一个呃,就是说我们的一个整体的一个形态的变化好,那我们接下来继续对于我们的图片呢。

其实我们还可以做一些其他的一个特征提取啊,这个特征提取呢我们就可以做一个嗯,关键点的一个检测,关键点呢其实是这样的啊,我们的一个关键点呢就如图所示啊,这个图可能有点密集恐惧症的这种感觉啊。

关键点就是说我们对于一个图片呢,它可能是存在一些比较关键的一个信息,这个信息呢,就是说我们是从可以从这个关键点的一个位置,来得到的,那么这个地方的关键点的一个位置呢。

就是如图我们的一个这个小圆圈的位置啊,这个有点密集恐惧症啊,对嗯我我我倒没有啊,如果各位同学有的话,可以稍微忍受一下啊,这个地方的一个关键点的一个位置呢,就是说我们的一个具体的一个操作呢。

我们其实是可以将具体将这些关,具体的一个位置给它提取出来,这些位置呢就是我们的一些关键的一个位置,那么有同学可能就会问到,老师这个关键的一个位置到底是什么位置,是比较关键的,这个呢就是这样的啊。

我们这个关键的位置呢,就是你可以理解,就是它其实是包含了比较多的一个边缘信息,就是它的一个颜色变化是比较丰富的,这些位置啊只是边缘位置,那么这个地方的边缘位置,我们如果把它嗯提取到之后。

我们把它识别出它的具体位置之后,我们能够做什么呢,我们其实是可以计算得到,用一个向量用来表征这个边缘,或者说这个关键点一个信息的这个地方呢,我们把它叫做一个关键点检测的一个,就是说具体的操作啊。

关键点检测我们对于图片而言,其实我们是拥有非常多的一些关键点,检测的一些呃特征提取的方法,这个地方呢我们是有这个shift shift呢,其实是里面非常非常经典的一个关键点。

特征提取以及关键点的一些一个检测的方法,它可以很有效地提取我们的关键点信息,那么这个地方的shift呢,它还有一个非常重要的一个特性,就是说我们的一个图片,如果我们把这个图片旋转了。

那么这个关键点会不会发生改变呢,其实是不会的,也就是说一个图片,如果一个图片他这个关键点信息他是,经过旋转之后,这个图片旋转之后,这个关键点不会变化,他是不会变变化的,那么这个地方是关键点的一个。

这种方法的一个优点,他的一个优点啊,就是说你可能会感感觉到很惊奇啊,一个图片旋转之后,这个关键点为什么没有变化,因为这个地方的关键点它的一个提取方法,特征提取方法它不是说是很简单的嗯。

利用这种啊这个什么加减乘除啊,或者说这种计算,它其实是用到了这个尺度的一个信息,所以说它是跟我们的旋转,这种旋转的操作无关的,它是这种尺度不变的啊,就是说不管那个图片它怎么进行缩放,以及怎么进行旋转。

它的关键点一般是不做发生改变的,我们在这个地方呢,我们其实是可以将我们的一个具体的一个,关键点啊,把它做一个嗯匹配,这个匹配呢其实本质有点类似于这种含义啊,就是我们的一个具体的一个嗯操作呢。

我们就可以将我们的一个具体的一个语言,就是说这个地方我们其实是计算一下,两个关键点,它的一个具体是不是距离比较相等,具体距离是不是比较相等的,那么这个地方的距离是怎么计算的呢,这个地方的距离。

这个可能就稍微有点细节啊,我们每个关键点其实就是一个一乘,128的一个向量,这个地方我们的一个具体的一个关键点,他的一个信息就是一个1×128的,一个向量好,那么有了这个向量之后,我们能够做什么呢。

我们就是可以计算一下,我们的具体的一个关键点,他的一个相当于是他的一个具体的一个距离,对吧,我们第一张图片如果是由五五十个关键点,那么它本质就是一个,50×128的一个矩阵。

第二个图片如果是有50个关键点,那么它本质也是一个50×100,28的矩阵对吧,那么当然如果这个关键点的个数不一样,那么得到的一个矩阵的大小也不一样,在这个地方呢,我们其实本质是计算。

是需要计算一下我们的一个具体的一个关键点,他的一个相似度相似度对吧,那么如果这两个相似度它比较相似的话,那么我们就可以把它的一个具体的一个关键点,给它匹配上,然后匹配上对吧好。

那么这个地方我们的关键点匹配呢,就是将这些关键点从第一张图片里面找到,跟第二张图片里面的关键点的一个,具体的一个就是说距离啊,给大家计算一下它的距离,好这个地方我们可以看一下这两张图片。

这些关键点的一个位置,我们是能够匹配得到的啊,匹配成功的,也就是这些关键点,我们是认为它是能够匹配上的啊,能够匹配上的,那么这个地方我们会会发现,大部分的关键点其实是成功匹配的啊。

比如说这个角的位置对吧,这个角的位置,然后这个鞋子的位置对吧,那么这个地方其实有一些是匹配错误的,有些人匹配错误的这个对吧,我们很明显的看到,这个相当于是有交叉的这种情况,他其实是匹配错误。

那么这个地方匹配错误呢,他是为什么匹配错误呢,因为这个地方它其实本质在做匹配的时候,是做一个距离的计算,如果这个距离,就是说这两个关键点的距离是足够近的话,那么他其实就是匹配错误了,对吧好。

那么这是关键点一个信息,那么有同学可能就会问了,老师这个关键点信息他是全局的还是局部的,关键点的一个信息呢,其实它是一个局部信息,也就是说他其实本质是呃,描述了这个局部的图像,局部的一个特征。

它是描述的图像的局部特征,它跟这个颜色直方图不一样,颜色直方图是描述的图像的一个,全局的一个信息,好,图像的一个全局信息好,然后我们继续对于图片而言呢,其实我们还有比较关键的一个,就是我们的一个好。

我们看这个例子啊,我们的一个图片我们在经过缩放之后,其实他也是有成功匹配的一个关键点的啊,也是有成功匹配的关键点的好,对于我们的一个图片而言呢,其实还有一类比较关键的一个特征,就是我们的一个卷积特征。

卷积特征就是我们基于卷积神经网络,它提取的特征,这个呢可能就对吧,学习这个计算机视觉,你逃不过这个深度学习对吧,那么这个地方也是大致给大家讲一下啊,卷积神经网络呢我们刚才也给大家讲了。

其实本质就是由我们的卷积核,然后搭配我们的一个具体的一些层,然后完成一个计算的操作,那么这个地方呢其实在进行卷积的时候呢,卷积层其实本质是在做一个特征提取,本质是在做一个特征提取好。

那么我们的卷积神经网络呢,它其实本质也是一个就是说网络模型嘛,然后呢,他是经常可以用来做我们的一个分类的,分类的啊,就是说是一个有监督的一个分类,就是我们最终的分类的结果是一个类别,是一个类别。

那么这个地方其实如果是分类的话,那么我们的一个图片其实你会发现,其实它原默认的话也是一个维度降低的过程,也是一个维度降低的过程,首先我们输入的一个图片,假如说是64×64的,那么我们的输出的结果。

可能就是一个类别的一个概率的一个向量,类别的概率向量好,那么我们在做一个图片,做一个特征提取的时候呢,我们首先可以做一些相关的一个预处理,这个预处理呢,就是说在做一个图片的一个特征提取的时候。

首先呢预处理呢,我们是可以做一个图片的一个缩放,统一的一个缩放,这个缩放在做什么呢,也就是说,我们可以将图片把它缩放到一个,相同的一个尺寸,这个尺寸我们是把它缩放到一个512乘,512的一个尺寸。

在这个尺寸内,我们的一个图片它是相同维度的啊,就是所有的图片不管是任意大小小于512的,我们把它放大到512,大于五二的,我们把它缩小到五二,就是这样一个操作,然后呢我们缩放之后呢,就是这样。

这个操作是缩放啊,Reset,然后我们还做什么呢,我们还需要把它做一个归一化规划,就是我们需要把它转,从我们的一个具体的一个颜色的一个空间,把它转成我们的一个具体的一个像素空间。

或者说把它转成一个tensor的空间,在这个tensor的空间内呢,我们的一个图片,它的一个相当于是是在一个比较规整的,一个范围内,在一个零一的范围内,相当于是做一个min max的一个规划。

然后做一个NOMINIZE,这个罗MINIZE做什么呢,就是做一个减去均值,除除以方差的一个操作对吧,减去均值除以方差,这个地方的一个减去均值和除以方差,方差和均值从哪得到的。

这个方差和均值就是我们的原始的数据集,我们提取得到的一个数据集的一个平,均值和方差,这个地方我们有三个通道,分别是什么样什么样的一个含义呢,这个三个通道分别代表的是我们的三个通道的,一个均值和方差。

也就是我们有RGB3个通道对吧,然后分别统计三个通道的一个均值方差,我们按照这个通道的维度来做一个减去均值,除以方差的操作,好,这是PYTORCH来写的啊,然后他其实就是定义我们DATASET。

然后然后从我们的data session里面,定义我们的data loader好,然后呢,这个地方如果我们想要从我们的一个图片里面,提取特征呢,我们是非常建议从预训练的模型提取特征的。

这个地方就是说我们的一个提取得到的特征啊,其实他是希望尽可能有用的有效的对吧,那么这个特征呢应该尽可能的是呃有意义的,有意义的,那么这个特征呢它的一个提取方法,其实是跟我们的模型强相关的。

也就是说这个地方我们可以用一个预训练模型,Pretrain model,然后做一个预训练,这个地方的预训练呢,其实我们现在有非常多的一些预训练的,一些模型,我们直接可以拿来进行使用。

我们这个地方呢是用一个叫做RESONNET,18的一个网络模型,然后是它已经预训练好了,也就是说这个地方,它的一个网络结构已经定义好了,它的参数也定义好了,我们直接将它拿过来,然后提取一个特征就行了。

我们这个地方的提取特征呢,我们是呃只需要它提取特征啊,我们不需要它做一个分类的操作,也就是我们需要将它的一个最终的网络结构呢,剔除掉它的最终的全连接层,然后只让它提取我们的一个CN的特征好。

也就是说我们在这个地方将它的网络结构呢,稍微做了一点点修改,稍微做了一点点修改,然后接下来做一个提取特征,提取特征其实本质就是一个正向传播,对于我们的深度学习就是提取特征的操作啊,正向传播就是提取特征。

提取完特征之后,然后我们就可以对我们的图片,计算特征与特征之间的相似度,这个地方的特征与特征值之间的相似度呢,就是我们的图片在特征空间,如果这个图片在resident18提取完的特征。

它如果是一个维度是512的,那么我们就计算两个向量,512维度乘以512,就是一个向量是512,然后另一个向量也是512,然后计算这两个向量之间的相似度就行了,好这就是我们的一个图片特征提取。

图片特征提取,那么图提取完这个特征之后,其实本质这个计算你直接用这个dot,就是我们的一个内积距离就可以算它的相似度,算它的相似度了,好那么这就是我们的一个图片特征对吧。

我们有这个嗯图片的一个哈希值颜色直方图,关键点,以及我们的一个深度学习的特征,那么这个地方其实呃有同学可能就会想到,我们不同类型的特征,我们到底怎么进行选择呢,其实是这样的啊。

我们刚才也在PPT里面给大家讲了,我们的不同类型的一些特征呢,其实它的一个呃就是在做使用的时候呢,我们有图片哈,希值有颜色直方图,有这个shift的关键点对吧,还有CNN,它其实用途不一样,用途不一样。

图片哈希值呢比较适合用在图片的一个,驱虫的任务,就是说如果想要从百万,就是说从图片的数据库里面,找到我们的具体的一些相似的图片,相似的图片,那么我们用图片哈希值是比较适合的,是比较适合的。

那么我们的图片颜色直方图呢,如果我们想要从这图片里面找到颜色,比较相似的,颜色比较相似的,那么用颜色直方图比较好,那么shift的关键点呢,shift的关键点其实是这样的。

shift的关键点它比较适合用在局部相似,局部相似,这个局部相似,它就跟前面的这三种这三种不一样哈,希值颜色直方图以及CN都是全局,这个是局部,这个是局部,它其实是存在一个差异的。

存在差异的shift的关键点,它其实本质一个图片提取得到100个关键点,其实本质假如每个win的维度是128位,如果每个关键点的一个维度是128位,那么它提取到的就是一个,100×128维的矩阵。

另一个图片如果是200个关键点,那么它基基本上提取得到的是,200×128位的矩阵对吧,所以说这个地方,其实本质我们得提取得到的一个特征呢,其实是不一样的啊,不一样的局部关键点。

其实本质就是提取在脑的关键点信息,那么关键点信息它用在什么场场景呢,就是如果是用在版权检索,版权检测的一些任务上面,局部关键点是比较比较适合使用的好,那么这种卷积神经网络其实也是一种全局特征。

也是一种全局特征好,那么就看不同的一个应用场景啊,那么我们的今天给大家讲解的一个实践案例,就是嗯对于图片分类呢,你可以用我们的一个TFADF,提取我们的特征,然后用机器学习的模型完成一个建模。

如果是我们的一个具体的一个图片分类呢,你可以用嗯CNN搭建我们的一个网络模型,然后对我们的一个图片进行一个建模,然后呢我们也给大家讲解了一下,图片提取特征和文本提取特征的两个进阶的,都是book。

如果各位同学感兴趣啊,你可以下去将这两个进阶的LOTUBOOK进行,好好看一看,然后呢我们这节课其实是给大家嗯,就是说过了一遍图片和文本,我们在进行操作的时候,我们如何提取特征啊。

以及这这两个领域它的一个具体的一些关键点,需要注意的是,就是我们不同类型的数据呢,我们需要不同的处理方法,并没有绝对的一个银弹,就是说所有的数据啊,我们都是用相同的一个操作来做处理的。

并不会存在这样的一个,完完全全的一个通用的方法,其次呢我们的不同类型的数据呢,其实我们的建模方法也不一样对吧,我们刚才很清楚的给大家看到不同的数据,我们的建建模具体的模型也不一样。

那么我们的一个这个到底用什么模型呢,我们遇到一个数据到底用什么模型呢,这个就是我们需要就是说学习的,也是我们的一个领域知识,就是对于我们的一个呃算法工程师,其实本质就是在我们的一个得到我们的一个。

数据的情况下,我们如何去构建一个模型,这个模型是需要嗯跟我们的一个呃,就是呃数据完全匹配上,然后能够跟得到我们的一个具体建模结果的,这个其实就是算法工程师的一个核心能力啊,就是拿到一个数据。

我们能不能就是说进行一个解决,第三个呢,就是说ALP和CV都是非常好的一个应用方向啊,然后再做一个具体应用的时候呢,嗯你可以选择你你自己想要的一个,就是说领域啊想要的一个领域,然后进行一个实现呃。

你会发现呢我们具体的一个网络模型呢,它在进行实现的时候,可能在网络模型的一个角度啊会存在一个差异,但是呢我们在嗯机器学习的一些基础上面,其实是相通的,也就是说虽然说这不同的数据。

我们得到的一个模型不一样,但是呢我们的一些比较基础的知识都是相通的,比如我们的模型我们如何划分训练集和验证集,我们的模型如何判断它是不是一个过滤盒的,这些知识都是我们在机器学习的一个基础的。

一些理论步骤给大家讲的,这些都是相通的,也就是说模型不同,但是这些基础都是相通的,这些基础就是相通的,这些基础的一些理论知识都是相通的,而且是跟我们的结构化的数据是也是一样的啊,也是一样的。

好那么以上呢就是我们这节课的一个内容嗯,同学们有什么问题吗,如果有问题的话呢。

可以提出来好不好对,呃我们的手机用户906同学,以及我们的clock同学有没有问题啊,对嗯通过这节课,希望两位同学以及我们的看录播的同学,能够把嗯CV和NLP啊做一个基础的入门对。

然后这些库啊都是一些积累啊,比如SKN啊,以及这个KOS啊,以及呃这个PYOR器啊,对你可以先去了解啊这些库的一些技术使用,特别是我们的AP入门,这个notebook和CV入门。

这两个notebook啊是一定要掌握的,然后还有这个图片特征和文本特征,这两个都是不可能,是可能稍微有有一点点的难度,你可以优先去学习一下CV入门这个逻辑,book和LP入门入门这两个逻辑不。

呃两位同学有问题吗,对我们待会呢会把这个look tebook呢,上传到我们的一个QQ群啊,我们的代码具体上传到我们的QQ群,有问题吗,同学们,我之前遇到过数模型,好像不支持binary的一个特征。

是我操作有误吗,呃这个地方嗯应该是你操作有误,数模型是支持的,就是数模型肯定是支持这种数值的一个输入的,他肯定是支持的,应该是你操作有误啊,你可以你待会拿着我们的一个代码,你再跑一下好不,好还有问题吗。

好那么如果没有问题,我们今天的一个直播就到此结束,好不好,然后大家如果还有问题呢,也可以在我们的一个QQ群里面进行提问,我在稍等,稍等大家一分钟啊,看大家还有没有问题,好那么我们今天的直播就到此结束啦。

好的谢谢大家啊。

1447-七月在线-机器学习集训营15期 - P7:3-SVM与数据分类 - 程序员技术手札 - BV1ASste6EuZ

好那我们闲话不多说,然后我们就直接进入到我们今天的正题,就是SVM好,然后我们今天的主要内容是讲SVM的模型,然后主要会在在这个讲解过程中,会让大家了解到就是SM的模型的基本的推导。

然后嗯然后还有SVM的实战,然后在文在文本分类上的应用,然后在SM模型的推导过程中,会给大家讲解如下几个知识点,第一个就是一个线性可分的分类器,然后然后后面还有一个是线性不可分。

就是在线性不可分的数据上,我们的SM的模型是怎么样去构建的,然后还有就是SVM的求解呃,SM求解就是有一个叫做SMO算法,当然在讲解这个的过程中,我会把就是中间用到的一些数学知识,也都串起来。

那当然如果大家知道的话,我们可以跳过,如果不知道的话,我们可以过一遍,好然后今天的homework,然后会跟那个就是今天的实战文本分类相关,然后嗯对,然后但到后面我们会细说好。

我们再讲SVM的模型的构建的就是模型的嗯,构建过程中我们会讲到如下的知识点,就是第一个就是第一个是函数间隔和几何间隔,然后第二个就是自由间隔分类器,然后所有间隔分类器就涉及到我们把SVM去嗯。

把SM模型的建模就已经建出来了,然后在建在建模完成之后呃,他作为一个数学问题,我们会使用一个叫做拉格朗日方程的东西,去对它进行求解,所以说我们中间会补充一些呃高等数学的知识。

然后在在补充完这个数学知识之后,我们会去讲自由间隔分类器是如何求解的,嗯对然后再讲到呃,在讲到用拉格朗日的方法,对自由间隔分类器的求解做了一些变化之后,我们会介绍会引出SVSMO算法。

然后这个SMO算法就是呃去求解SVM的,一个比较呃比较直观的一个算法,然后然后在讲完前五个之后,其实SVM的模型就已经是,大家就已经有一个概念是SM模型,就是这样这样子的,然后在后面我们会介绍两个扩展。

一个叫做合计法,这个合计法就是SM里面一个常用的技巧,然后用来处理呃线性不可分的数据的,然后还有一个叫呃,还有一个是软件和分类器,它也是呃去求解啊,当数据线性不可分的情况的时候,SM是怎么求解的。

好了讲完这两个之后,我们会用另外一种方式,就是荷叶损失函数的一种方式,再去重新理解一下SVM,然后再到最后我们会会讲解到,SVM是如何去做多分类的,然后这个就是我们今天的。

这是一个主要的一个呃知识pass吧,就是知识路径,然后希望大家能跟上,就是说呃是这样的,因为今天的知识点比较多,公式推导也比较多,所以大家如果中间没有听懂的话,或者是没有呃,就是觉得我没有讲清楚的话。

可以那个随时打断,然后我我希望就是说因为知识点很多,所以我希望大家都能听懂,就是我们也不求多,只求那个我们能把每一步都听懂,好然后嗯如果还有同学没有那个没有进来的话,可以看一下。

就是嗯可以看一下丽娜在群,在群里面发的一个一个截图,然后可可能需要修改一下浏览器的设置,才可以进来对,然后如果没有声音的话,建议再重新嗯重新进一下,或者是重新换个浏览器试一下。

首先是那我们先介绍函数间隔和几何间隔好,那我们看到下面有一有一张图,这个图里面是一个数据集,当然它是一个二维的一个图形,然后黑点的话就就代表正一类,然后空心点的话就代表一类。

大家可以看到它其实是一个线性可分的,数据集嗯,因为因为我可以画一条直线,把这两个数据集完完全全的分开,当我画完这条直线的时候,我其实这条直线的方程是W乘以X加B等于零,就是在这条线上的所有点呃。

代入进去之后,W和B呃,带我到W和B中去,就会使得这就会使得最后的方程数是零,然后在这条线下面的的这些空心点,他们都是W乘以X加上B都是小于零的,当然在实心点都是W乘以X加上B是大于零的。

好对于一个线性的数据集来说,那我们可以随随便便的就可以画一条直线,就可以把它给区分开,当然我的线还可以这么画,还可以这么画,还可以这么画,那么问题就在于哪一条线是最好的。

好对于一个线性可分的数据数据集来说,那我们可以再画出来N多条线,画出来无数条线,然后这无数条线都可以把这个呃,都可以使得准确率能够达到百分之百,但是这无数条线里面总有一个是好的,总有一个是坏的。

比如说这个贴着两个点的,我就觉得应该不如在中间的某一条线好,那么该怎么样去衡量这个事情好,那我们用数学公式来表达一下,第一个那我们先建一个呃,建建一个模型,它的模型的参数是呃W和B。

然后呃它的表达式是W乘以X加上B,然后经过一个激活函数吧,然后这个激活函数也可以,大家也可以认为是一个只是函数啊,这只是函数里面,当里面的值是小于零的时候,就是一,当里面的值大于零,大于等于零的时候。

就是一好,已经有同学开始剧透了啊,可能大家已经有有用过那个SOM的,已经知道了是最小间隔最大的,这个对这个事情好,那我们还是照顾一下对S没有了解的同学,然后我们还是继续讲清楚,好那么对于对于这个分类。

对于这个数据来说,它的分类模型就是这样的,HWBX等于GWX加上B好,那么它的函数间隔是什么,它的函数间隔其实大家可以认为,就是把这个点带入进去之后,得到的得到的值就成为它的函,就成为它的函数间隔。

好那么我们可以看到把这个点代入进去之后,他为什么在前面乘以一个YI呢,因为我们刚才是讲过,就是说这条线我们可以看到,我们可以看到这条线可以使得那个可以使得嗯,可以使得那个整个数据集被区分开。

然后当我把这个值把实心点呃,代入到这个线的方程中去之后,那么它的值不是等于零,而是大于零的,然后当我把空心点的值代入进去之后,那么它的它的值是额是小于零的,而是小于零的,所以说当如果是空心点的时候。

那么W乘以X加上B的这个数是是那个负数,而负数是不能作为距离的这个度量的,所以说在我们这里用了一个取巧的办法,就是说我们把类别值给命名成正一和一,就作为它的符号,对于是负类的的,对于父类的数据集数据点。

我们乘以这个符号之后,它就变成了正数,好至于有同学问为什么是这个式子,那我们来看一下它的几何意义是啥,好我们我们可以看到画一条线,然后我们可以看到,我们比如说画一条比较简单的线,就是Y等于Y等于X。

然后在这条线里面,那么它的方程是什么,它的方程可能这个是Y这个呃也不能这么写,就是,相当于是我比如说我还是根据刚才那个数据,跟从那个数据,从刚才的那个数据集中来,然后在这里他的X其实是两个分量。

然后X1和X2,这个是X1,这个是X2,然后我画了一个线是比较呃比较简单的一个线,就是他经过原点,所以它没有截距啊,没有截距的话,B就是零,所以这个大家应该可以理解,那么这个线的方程其实是X1减X。

二等于零对吧,那么相当于是比如说我在这个线上的所有的值,比如说这个一一,这个值叫一一,那么代入到这个方程中去,1-1就等于零,那么比如说我有一个正,我有一个正类的数据点在这里,这个点是一二。

那么它带入进去之后,他代入进去,带入进去之后,对我们在这里可以变成X2减X1吧,他带你进去之后,那么2-1就等于一,那么它代表的含义是什么,它代表的含义其实是这段距离。

就是就是说从就是以跟Y轴跟Y轴是平行的,然后这个数据点到线上的,这个数据点到线上的距离就是一,这个就是啊函数函数间隔的几何意义,好那我们可以看到对于这个问题来说,我们要找到一个最好的。

我们要找到一个最好的直线,那么在最好的直线里面,就是说呃,我先我对于每个数据点都计算出来,它的函数间隔,然后然后,有同学说好像公式好像错了,但是其实不是这样的,因为我在这里计算的是几何,是函数间隔。

还不是几何间隔,所以呃后面会讲到几何间隔,好那么函数间隔是这样,然后那么我对于每一个每一个数据点,这都可以计算出来它的所有的函数间隔,然后呃对于一个值,对于对于一个直线来说,我可以计算出来所有的。

就是对于一个直线来说,我可以给它计算出来一个值,这个值叫做叫做最小函数间隔,这个最小函数间隔就可以代表的,就是就是说我可以去衡量说,这个这条直线到底跟这个数据集的一个,拟合程度。

对刚才有同学说我举的例子是X2减X1的,对,其实就是这样子,嗯好好,那么我们可以看到,那么我们就我们可以看到,如果是对于函数间隔来说,我只要把W和B,我只要把W和B成倍的去进行增大。

那么这个函数间隔就可以变得无限大,那么我们刚才介绍的这个最小函数间隔,其实就就没有什么意义,就是就是说呃,我我我只要成倍的把W和B进行增大之后,就可以使得这个最小函数间隔变得无限的大。

所以说这个函数间隔它的含义是呃就是没有,那么就是它是一个它并不能够代,并不能够完全的代表这条直线的一个好坏,所以说我们在这里又引入了一个几何间隔,这个几何间隔的含义,就是说他把这个值给设的。

也更加的就是做了一个normalize,然后做normalize的必要必要条件,就是说我把这个,我把这个W给设成一,好有同学,有有同学在表示说,函数间隔是指什么之间的间隔,函数间隔是指的是。

数据点和这条直线之间的距离,好有同学在问Y乘以WX1加上B呃,是和X2和X减X1是一个意思吗,在这里可能大家那个没有,就是可能大家没有没有没有那个正确的去理解,我刚才的说法是这样子,就是对于一个。

对于一个对一个二维空间X1和X2,那么我在这里其实X其实它是一个向量,就是它是X1和X和X2的一个向量,然后W也也是一个向量,所以在这里其实相当于是X1X2是一个向量,然后W1W2也也也也是一个向量。

然后B是一个标量,所以它比如说我刚才的这条直线,他是这样子,但是他其实是W1乘以X1,加上W2乘以X2加B等于零,不好意思啊,那个我的触摸板好像有点问题,然后导致他写出来的公式有点模糊。

在这里这条直线的含义其实是W1乘以X1,加上W2乘以X2,再加上B等于等于零,对,然后我我我把这条直线的,就是表达式给求出来之后,那么就变成了其实就变成了那个就是,在WZ在X1上的这个系数。

其实就相当于是负的负X1加X2,然后B因为我的这条直线是经过原点的,所以我的B应该它的结局是零,所以所以那个B是零,所以这条这条直线的方程是这样的,就是负X1加X2是零,然后对于一个一个点二一来说呃。

应该是一二,然后他带入进去之后就是一二,然后我代表我,我我想要它,我假设它是一个正类,所以说-1+2是一,就是W乘以X加上B的值是一,然后Y也是一,所以1×1,然后这个函数间隔就是一。

所以刚才的意思是这样子的,然后我们可以同时看到,除了这个W之后是什么样子的,我们可以看到,还是刚才的那个还是刚才的那个数,然后我们可以看到,其实他在这里他的W是一个向量,然后这个向量在在X1上的值是一。

在在那个在X2上的系数是一,他的W是这样子的,然后对于二一这个点,他们我们刚才计算出来的函数间隔是一对吧,然后然后他再他再把那个呃令令这个数是另,令这个这个系数是一是一,所以我们可以先先计算一下。

就是呃这个是W的,就是那个叫开平方的一个值啊,应该是二阶平方的二阶开方对,然后我们可以求求一下,我们可以先在这里先求一下它的,它的值就是一的平方,加一的平方等于呃等于二,然后相当于是他然后再开。

然后再开方之后就成了根号二,然后相当于是我们现在,W是等于根号二,然后我们令W是一,所以所以那我们就需要,那我们就需要在每个上面都开一个,就是都需要呃,需要使得W再乘以一个根号12。

就相当于是因为我现在是根号二嘛,然后我如果让他等于一的话,那我们需要除以根号二,所以我们在W的每个分量上都除以一,除以一个根号二,这样就就相当于是我计算出来的这个距离,就变得就就变得是一个呃。

是一个比较绝对的距离,其实它的几何含义就是这样子,就是我我在函数间隔上再除以一个根号二,就相当于是我把这个我把这个W的范数,然后二阶范数再除再除一下,其实就相当于是我这个点到到直线的一个呃。

一个就是最短距离,垂直距离,相当于是在在这个直线的法向量上,又求出来的一个距离好,然后这个是几何间隔的意义,几何间隔的意义就代表了,就是说这个点到直线的最短距离,好那我们介绍介绍完了这个几何间隔。

然后我们再往下看,好那我们如果介绍完几何间隔之后,那我们就可以下按键,就可以推导出来说哪一条直线是最好的,哪一条直线是最好的,那个直线最好的那个就是代表说的含义,就是说它的几何间隔是最大的。

然后它的几何呃,当然我们刚才也说了,就是一个直线的几何间隔,一个一个直线的函数间隔,就是一个直线的函数间隔,就是所有的数据点到这个线的,所有的函数间隔的最小值,那么同理,一个直线的几何间隔。

就是所有的数据点到这个直线的呃,所有几何间隔的最小值,所以一个最好的线,一个一个最好的分类,一个最好的分类线就是呃一个最好的分类线,就是呃几何间隔最大的一个分类线,有同学问为什么刚才除以根号二。

因为是这样的,就是刚才我的W我我我的W是呃,我的W是一个向量啊,这个向量是一一,就这个这个向量的值是一和一,一和一的二阶范数就是根号二,好,那我们刚才其实我刚才说的那一段比较长的话。

其实就是用这个公式可以可以表达出来,然后我们可以使得,就是因为我在这里另设了一个限制,叫做呃叫做大于等于一,所以我在这里呃,当W等于一的时候,我这个伽马其实就相当于是一个呃,是一个几何间隔。

然后我最大化这个几何间隔,使得所有的数据点,所有所有的数据点,所有的数据点都大于等于这个几何间隔,然后同时W还等于一,啊二阶范数就是L2就是欧式距离,欧式距离是两个点之间的呃,是两个点相减。

然后再求二阶范数,所以二阶范数跟跟欧式距离没有什么关系,就是你可能把这个概念给弄混了,就是二二阶范数是求欧式距离的一个手段吧,而二阶方式就是指对于一个向量来说,每个分量都求平方,然后再开根号。

然后把每个分量加起来,然后再求根号,有同学问呃,W的范数为什么是一,W的范数是一,就代表它是几何间隔,然后几何间隔相对于函数间隔来说,就是一个是一个比较绝对的数,因为如果是函数间隔的话。

我可以把W成倍的成倍的变大,然后就是就可以使得函数间隔也成倍的变大,所以它不是一个定值,为什么W垂直于直线,这就是那个呃就是怎么说呢,就是就是说这这可能就是在几何意义上。

就是说呃W的范数就代表着这个几何含义,就是它其实是一个法向量的一个一个求法,是,好,那么对于这个问题来说,我们可以看到它有很多个,为什么W等于一的条件下函数间隔最小呢,不是这样子的。

就是说函数间隔的大小,跟跟那个W等于E没有关系,就是你还可以把呃,就是说相当于是一个标准,就是我练W等于一,相当于是这个函数间隔就到了一个标准上,大家都是这样去计算的,当然因为如果不是这样的话。

你可以成倍的去调整W,然后使得函数间隔可以变大,可以变小,函数间隔不是在W点E的时候最小,而是说它是一个变化的值,而几何间隔因为W等,因为我设定了W等于一,所以它就是固定不变的。

好那我们可以看到其实我们刚才的问题的表达,就是说我要找到一个这样的分类面,我要找到一个这样的分类面,使得它在线性可分的时候,这条直线是最好的,然后SM的一个基本的一个核心思想。

就是说我要找到一个这样一个最好的这样的线,从而去去去个更好的去分类,然后大家可以理解的,就就是说因为大家可以看到就是这条线呃,这个点到到那个到分类界面的这个距离,我们可以其实可以把它理解成为执行度。

就是说呃当这个点离这个分类界面越远的时候,我认为就是说我可以直观的去去理解,我这个点被分类的置信度就会比较高,当然当它比较接近边缘的时候,那么我可能会认为说,这个点到这个点被分类的置信度。

不是那么的好好,那我们还看到呃呃最后的这个问题的表达,就在于我要找到一个最大的几何间隔,使得呃使得所有的数据中,所有的数据点都大于等于这个间隔,就是我们就是我们现在这个图上的,一个表达方式。

但是大家可以看到对于这样的一个问题来说,我们还没有特别直观的一个idea去去处理它,然后因为是这样的,就是就是说它有很多的条件,比如说有数据点的约束条件,然后因为它是一个线性表达式嘛。

所以它是一个凸性约束,然后呃对于这个W来说,它是一个非凸性的,然后所以比较容易达到局部最优,然后同时它的变量数是W乘和B,还有还有这个还有这个伽马,然后所以它的变量数也比较多。

然后我们可以通过一系列的变化,使得这个问题达到简化,好第一步将第一第一步的变化,就是就是说我们我们那个可以,可以通过那个可以通过除以W除以W的方式,来消除那个W的这个W的这个约束。

有同学问为什么W乘以X加上B是正一负一,因为我们PPT里面之前有讲,在这里就是有一个函数,这个函数它就是一个指数函数,当最小的时候是一,最大等于零的时候是正一,好大家可以,现在可以听到吗。

啊好可能刚才那个刚才网络有些问题,好,那我们可以看到就是我们在刚才有一个,这有一个这样的原始问题,然后我们在这里做一下简化,就是说我们把W等于一的那个限制给去掉,然后我们在在这里就是做个简化。

就是我们把W等,把W等于一限制给带到这个给带到这个限制,给带到这个约束条件中来,然后我们在这里两边都除以一个W,这样相当于是我wt除了这个W之后,除以了W的二二维就是二阶函数之后。

那么在这里整个它就是一个它就是一个呃,他就是一个在这里除以它,它之后,那么W的范数其实就是一了,然后同时我们做了一些我们那个在在这个呃,在不等式的两边都除以了W之后,那么伽马除以这个W其实就相当于是嗯。

是几何间隔呃,是这样的,就是就是说有同学问这个W不是一吗,这个W的范数不是一吗,我们在这里有有一个条件是是W范数等于一,然后我们先把这个W的W的范数等于一,给给调整到那个就是给去掉,然后给调整到那个。

给调整到给调整到函数表达式中去好,我们可以看到在这里,为什么去掉,然后去掉的原因就在于,我可以使得它这个问题变得更加简化,然后我在呃我们大家可以先不看最下面这一行。

我在上面两行的每一个地方都除以了一个W,多出一个都除以一个一个W的二阶范数,然后就,然后就相当于是我把W等于一的,这个条件给加进去了,相当于做对,有同学已经说了,相当于做了归一化,然后我在这里其实是。

因为我的两等式两边都除以了W,所以我还我还可以把这个W消掉,然后整个问题就变成了,我去max这个伽马除以除以W,其实相当于是相当于这个问题,就变成了一个这样的问题,就是伽马是函数间隔。

函数间隔除以W模之后,那么它就是几何间隔,对吧,就是我在这里,我本来伽马的含义是是函数间隔,然后除了W的二阶函数之后,就变成了几何间隔,然后在这里,我仍然我的条件仍然是那个大于等于伽马。

好因为我在表达式中,我在这个表达式中,W和B可以通过成倍的调整去呃,去使得呃去使得伽马可以变成一,所以我在这里又做了一个简化,就是说我直接把伽马给设成一,然后在这里相当于是我干妈等于一之后。

它就变成了W的二阶范数分之一了,然后最最大化这个函数,就其实就相当于是最小化最小化W的范数,所以我可以把这个最大化的问题,给变成一个最小化的问题,所以在这里就做了第二个变化好,那么最终问题就变成了呃。

调整W和B,使得WW的二阶范数的平方是是最小的,因为在这里大家可以看到我突然加了一个平方,然后然后这个平方的含义就是,因为W作为一个距离,他其实是那个什么,就是他呃加加上平方之后,其实是我自己设的。

然后1/2也有同学也说了,是是为了封面求导,然后最大化最小化W和最小化W的平方,其实是呃是是一个意思,就是说他们是叫什么叫正相关,所以在这里其实我在这里应该是最小化,最小化这个W。

然后为了便于后面的计算,所以我在这里加了一个平方,好,那么最终问题就变成了最小化二分之1W平方,然后使得我满足这些条件,好,那么这个问题其实就变成了一个呃,比较就是在数学上就可以解决问题。

然后相当相对于之前我们的呃,我们的公式,然后他减少了一个参数,就是伽马,我们把伽马在这里在之前给给生成了一对哦,我们现在的问题跟刚才的那个,跟刚才最开始那个PPT里面的那个问题是等价的。

然后在我们的高等数学里面,就有一个这样的函数和这样的方法,去解决这个问题,就是去去U去最小化一个东西,使得它能满足某些条件,好那么这个这个东西是什么,这个东西就是拉格朗日函数,然后这个拉格拉格朗日函数。

如果我没有记错的话,应该是在高等数学里面,可能是上一期的上上册里面,会有这个函数的解释,这个函数呃,我们先回顾一下拉格朗日函数,拉格朗日函数的意思,就是就是说我最小化一个FW。

使得呃使得它满足条件hi额hi w等于零,然后,有同学问为什么引入拉格朗日函数,拉引入拉格朗日函数的一函数,的目的是为了去求解这个问题,好那我们在这里就是我们的,我们可以先假设一个简单的问题。

简单的问题就是就是说最小化呃,FW使得他满足这些约束,HIW等于零,然后我们有L个这样的这样的啊,这样的这样的函数,这样的约束,然后我们构造一个拉杆式函数,这个拉杆朗日函数就是说呃除了W之外。

我再加一个贝塔的一个一个值,然后这个值就是说,我把那个约束条件都给添加到目标函数中来,对,然后再后面就是LW乘以LW贝塔就等于FW,然后后面是所有的所有的呃约束条件,然后我在这里我要求我要求解这个问题。

其实我要求解的问题是,最后的是那个呃FW的最小值,然后那我就让L就是这个LW贝塔,对所有的WI的偏导数都是零,然后那L对于所有的贝塔I的偏导数都是零,那么我们可以看它是什么含义呢。

我们可以看一下LWLW贝塔,它的它它对于那个他对于,呃我们现在可以先看LLL对贝塔的偏导,L对贝塔的偏导,其实就相当于是只跟那个只跟hi打不相关,然后在这里就相当于是呃,我令啊L对贝塔对贝塔的偏导。

其实就等于HIW,然后在这里我要求解它,我们到最后要达到一个这样的效果,就相当于是hi w等于零,那么我们先看哦,那我们再看L对呃,对WI的偏导,就相当于是FW对那个对对对,对那个WI的偏导。

然后再加上后面的这个hi贝塔,HIW对那个对对对那个对WI的偏导,然后其实最后达到的目的就是FW是最小的,好那我们这是拉格朗日函数,然后我们可以看到有一个叫有一个扩展,就说可能高等数学里面没有。

就是就是说高等数学里面讲的那个都是呃,它的约束都是相等的,然后然后在这里,我们在广义上面可以引入一个不等的一个呃,JW的函数,好呃那么这个函数我们可以看到,同样的我们还可以去构建一个拉格朗日方程。

然后这个拉格朗日方程,其实相当于是,我把两个优势和线都分别加入进来,都分别加入进来,然后对于对于那个等式的约束条件,我们用贝塔系数去做,然后对于那个不等式的右边,我们用阿尔法的基础去做好。

对于一个有不等式的,有不等式的拉格朗日方程来说,我们对它的求解,就比刚才只有等式约束条件的时候,就变得复杂了一些,它的复杂地方就在于哪,就在于我在这里JIW这个是一个是一个不等式。

所以我要求到FW的最小值的时候,我需要我需要去做一个,我需要去做一个最大最小的一个变化,有同学问为什么是加在这里,加其实只是一个通用的含义,在这里如果贝塔是负数的话,那么就相当于是减了。

好那我们可以先先做一个这样的一个呃,这样的一个变化叫做极小极大,首先我们我们先对这个拉格朗日的这个,所有的这个变化后的这个函数求极大值,我们可以看到我们在这里其实有两个设置。

第一个设置是阿尔法A是大于零的,然后贝塔贝塔是无所谓的,那么我们调整阿尔法贝塔,使得我们先不管FW,使得那个可以看它这个推塔W,它的值可以变得有多大,我们可以看到,如果大家注意啊,如果都满足条件的话。

那么HIW是零,那么GIW是小于等于零的,然后在这里不管我怎么调整阿尔法和贝塔,那么它的它的那个最大值都应该是零,这一步大家可以理解吗,好那么我们可以我们那我们可以再看,如果当当某个条件不允许的时候。

比如说HIW它它不等于零了,那么我可以通过调整贝塔,我我使得贝塔调整的特别大,然后就可以又可以使得那个它的,比如说我可以使得那个是贝塔,调整到一个特别大的数,然后他就是一个正无穷大。

对如果JI不满足条件,当然了,当然如果JI都满足的话,那么JI小于等于零的,然后阿尔法I是大于零的,所以阿尔法I乘以JI,永远都是一个小于等于零的数,但是如果JI是一个大于零的数。

那么阿尔法我们可以使得阿尔法特别大,然后同时就可以使得GI就变得特别大,对吧,然后大家可以可以理解,就在这就是对于这个公式,我们求求最大值,当这些条件都到这条不满足的时候,那么它的最大值就是一个贝塔。

我总可以调整调整阿尔法贝塔,使得使得使得这个CAPW是一个正无穷大,当然当他都满足的时候,那么它的值就是FW好,那么我们再对这个C3PW再再去求极小值,然后我们调整W让他求极小值。

相当于是如果所有条件都满足的话,那么我们对这个公式的求导就是FW的最小值,就是原问题的解,但是如果呃hi和GI有有某个条件不满足的话,那么我们求的这个最小值就其实就是正无穷大,所以它没有最小值。

所以我们就求不到FW的解,好这个是广义拉格朗日函数,好我们大家可以看到在这里我们设一个P星,就等于那个就是这个问题,就是极小极大问题的一个最一个最优解,我们在后面会不会用到好,那么它有一个队友问题。

队友问题其实其实很简单,我们就是把把这个把这个min和max给那个,给给那个翻转过来,就变成了max min,好,大家可以,那个就是可能看到这么多公式,会觉得比较比较比较生疏。

然后大家就是说对于一个知识点来说,我们知道他的目的是什么,就先足够了,然后我们可以可以先看到,我们可以先在中间,我们可以那个对于一些具体的细节,我们可以先记住,然后然后后面再慢慢理解。

好我们在这里讲对偶问题的,对偶问题的原因是什么,呃这个问题的原因就在于我对问题的一个简化,就是说我讲了这个对偶问题之后,相当于是我的目的,是为了把那个极小极大的问题就会转化成极大。

几给点给转化成极大极小的问题,这样我在求解上就可以,就是在求解LSSVM的时候,就可以变得比较简单,所以这是广义拉格朗日,我讲广义拉格朗日函数的一个目的好,那我们可以看到极大机问题。

就相当于是一个呃max命的一个问题,然后同时在求max的时候,我是调整阿尔法贝塔求命的时候,我是调整W,好在这里,然后在这里呃就是呃我们先下定义,就是就是说呃一般来说不是。

一般来说就是我们有一个严格的区间的,就是就是那个地星就是极大极小问题,极大极小的问题,是极小极大问题的一个对偶问题吗,然后它的最优解是地星,然后地星是小于等于P星的,好有有有同学表示。

那个有有同学表示这次有点听不太懂,就是这样的,就是这一部分广义大纲老师函数的这一部分嗯,大家是可能是需要记一下的,就是它相当于是一个数数学知识,然后我也不会给大家展开去讲,然后大家只要知道呃。

在这个地方可以去验证队友,可以把那个SVM的解释方法,求解方法给由那个对,给由极小极大问题变成极大极小的问题,好在这里1D星一般是小额,是小于等于P星的,地星是对偶问题的对偶问题的一个一个答案。

一个最优解,然后呃所谓的队伍问题就是极大极小问题,然后P型是极小极大问题的一个最优解好,那么当这些约束条件都满足如下条件的时候,就是约束不不等式G都是凸函数,然后再在这里,因为我们的呃。

因为我们在SVM中,它的约束条件都是线性的,所以线性函数都是凸函数,所以呃所以SVM的问题是满足这个条件的,然后第二个条件是约束等式,H都是反射函数,然后仿真函数其实和线性都是等价的。

然后在我们的SVM这个问题中,它的呃这这一条也也是可以满足的,然后不等式是严格执行的,然后在这里就被不等式时间段之前,就就代表就是那个不等G不等式,是肯定是有那么一到两个,有至少有一个是肯定小于零的。

而不是都是等于零的,好,这三个条件是就是就是说不是需要大家理解的,就是需要大家记住的,就是他是数学课本里面,可能是数学课本里面就提出来的好,那么在上述的这几个假设下,只要满足KKT条件。

然后就就使得那个对偶问题和原始问题,是是等价的,好好那我们来看一下KKT条件,KKT条件其实就是相当于是五个条件,我们再看一下,就就是我们刚才那个不等式和等式的右条件,都加到一般还是能去的。

一个最后的表达式是这样的,FW加上西格玛嗯,贝塔I乘以HI,再加上西格玛阿尔法乘以GI,在这里需要满足五个条件,然后满足了这五个条件之后,就使得对,就使得那个队友问题的最优解。

和原始问题的最优解是是那个等价的,这五个条件是分别是这样子的,大家可能在这里是要记一下,然后我们可以看一下,当然如果他是,我们可以看一下,当然当然如果这五天的含义分别是什么阿尔法,我们先看第三个阿尔法。

I乘以JI是等于零的,相当于是相当于是在在在这里,因为我们GI是一个不等式的表达式,那么当GI小于零的时候,我们就肯定就使得阿尔法的这个值是零,所以它才能等于零,当那个呃GI是小于小于零的时候。

那么当JS是那个等于零的时候,那么我们在这里阿尔法还可以不用是零,可以可以是任意值,然后他这个条件就可以满足了,然后同时GIW星是小于等于零的,就是不等式的条件,要满足,然后阿尔法星是大于等于零的等等。

对,有同学说,拉格老师和KKT当定理记住就可以了,对是的好,那我们在这里,因为它是需要我们记住的,所以就记住就好了,那我们在刚才的那个问题上,使用那个使用我们刚才讲的拉格朗日方程。

我们在这里就是我们把不等式的这个这个条件,相当于是变成了负的,就相当于是只有因为我们在原始问题里面,可能只有不等式的约束条件,所以在这里就就写出了就是这个的公式,就是我们原始问题可以变成这样的一个。

一个问题,然后再使用拉格朗日方程之后,就变成了一个这样的问题,变成了LWB和阿尔法,因为没有那个没有等式的约束条件,所以我们就只有嗯只有不等式约束条件,然后就变成了这样,好啊,有同学来表示。

那就是就是那个应该是这样,就是支持向量机,比较比较就是数学知识会比较多一点,所以可能大家理解上都会稍微有点嗯,就是一遍可能理解不透吧,有有同学表示这样的对,其实就是这样的,但是但是大家一定要坚持下去。

因为后面已经到了简单的部分,好那么我们刚才可以看到,其实我们把把这个问题,套入到拉格朗日方程中去之后,就得到了一个这样的表达式,然后这个表达式就是我们要求解的目标,我们要我们要求那个。

我们要求二分之1W2阶范数的最小值,然后我们使用对偶问题去去去求解,然后队友问题就是先先求极小啊,再后求极大,好在这里就是我们先固定,先固定阿尔法,然后对W和B进行求导,然后,其实就是我们对这个式子。

然后我们先固定阿尔法,阿尔法是不变的,我们先不管它,然后对对于那个W和B先去求偏导,然后我们可以看到,如果是对W求偏导的话,那么它就变成了是对这一项求偏导,然后然后再再再把这一项给,再对这项再求偏导。

好这一项,Sorry,在二分之1W的平方的这一项求偏导的时候,其实我们可以比较简单的,就是比如说我们之前对X的平方求偏导的时候,二分之1X的平方求偏导的时候,它其实它的偏导就是X在这里其实是一样的。

就是虽然他加了范数,我们也可以一栏把它当成是一个呃,当成是一个数就好了,然后在这里我们就可以让他就是二分之1W,二分之1W的平方求偏导就是二,其实就是W4级,然后在这里跟在这个西格玛里面跟W相关的。

其实就是就是这一项,这一项跟W相关,然后因为我们是对W求偏导,所以在这里只有一个W自己,所以我们把系数提取出来就好了,在这里就是其实就是西格玛,阿尔法A乘以YI然后再乘以xx,然后把这两项加起来。

就相当于是W减去它,相当于是这一步我们对W求偏导,其实就是这一步的W,还有这一步的阿尔法IYI乘以XI,加起来就就是W的偏导,然后如果是对B求偏导的话,因为我们在这里跟B相关的其实就这一项。

所以而且它是一个一次项,所以我们在这里就只需要把它的系数提取出来,就可以了,它的系数就是啊阿尔法I乘以Y,所以这是B的偏导,然后我们可以看到最后的求解就是这样子,就是呃这个LWB阿尔法对W求偏导。

就是W减去C干嘛,阿阿尔法IYI乘以XI等于零,又推出了W呃,就是我们在这个值最小的时候,我们就得到了W应该等于西格玛阿尔法,IYI乘以XI,然后同时那个对B求偏导,就是阿尔法IY我刚才就已经看到过了。

然后因为我们求出来这个之后,我们再把这两个式子,再再把这两个式子再代入到原始的,再带入到原始的这个这个表达式中去,然后我们就可以得到一个新的问题,我们可以看到这个是一个代入的过程,就是把把W的性质和和。

那个和和这个式子都代入进去之后,我们来看第一,第一步是这样代入的嗯,首先第一步是二分之1W的平方,我们可以写成这样,然后第二步我们把它先先展开,就是把这个西格玛的这个数字先展开。

第一步就是阿尔法I乘以Y乘以WT乘以XI,然后再减去再把B的这一项展开,就是阿尔法I乘以Y乘,再乘以B,然后再因为这里有一个负号,所以后面应该是一个加上西格玛阿尔法N,那么我们可以看到。

因为我们刚才看到了B在这里是一个标量,而阿尔法I乘以YI乘以西格玛的这一项,就这一项它其实是零,然后我们就可以把这一项就可以干掉,然后我们在这里,因为我们可以看到有一个W是等于一个数的。

所以所以我们把W这个数给带入进来,就成了这样,然后这一项也也也在这里,这一项其实跟那个跟这一项其实是一样的,就是就是说把W带入进来之后,那么投头里面的这个WT乘以W,跟这一项就是其实是一样的。

但是它后面它前面有一个系数是1/2,所以1/2的这个数,再减去它本来这个数其实就是-1/2,变成了-1/2,所以在这里是这样子,然后我们把西格玛阿尔法这个数再放到前面来,然后就成了一个一个这样的数。

然后就成为一个这样的视频,同时我们在这里看到还有一个wt,所以我们还可以把这个WT再替换掉,就成为了一个这样的是不好,然后最后我们可以看到我们把把那些把把W的,把W给替换掉,然后把AI乘以Y西格玛。

把西格玛AI乘以Y等于零,这个给带入进去之后,这个公式就变成了这样的一个公式,那在这个公式我们可以再做一个变化,就是说把这个西格玛的这一项提到前面去呃,呃也相当于是把阿尔法A乘以YI给提到后。

给给进给提到那个给放到西格玛函数中去,然后就得到了一个这样的式子,就是后面就变成了所有的式子都放在一起了,然后同时因为阿尔法I,阿尔法GYYG都是标量,所以他们都就是一个数,可以看成一个数。

然后后面XG和XI其实都是向量,所以可以把它看成是一个内积,然后所以最后的问题就变成了调整阿尔法,使得后面这个式子是最大的,然后同时我满足几个给我条件,就是阿尔法I是大于等于零的。

西格玛I等于1M阿尔法YI是等于零的,然后这个是我们上一步求出来的,所以到现在为止,我们的这个问题就变成了这样的一个问题,是我们刚才是最原始的那个问题,已经现在被我们被我们变换的,是就被我们变换的。

可能我们现在也完全不是特别认识了,就变成了这样的一个问题,好那么在这个问题里面之后,我们可以先直观的去理解一下,去去去理解一些,就是中间的一些值的概念的含义,第一步就是就是说和阿尔法。

阿尔法是大于等于零的,那么什么时候是大于零的,什么时候是等于零的,我们在这里大家可以先记住,就是说在求解完之后,每一个非零的阿尔法,就预示着它是它是支持向量,所谓的支持向量其实就是那个就是他在边界。

它在那个呃,他在边界点上的,他在边界上的一个一个向量,好,在这里给大家写一下支持向量,好比如说这个这条线是最,是那个我们的支持向量的分界面,然后然后同时我这条线平行的,往往两侧去去推展,那么在正力上。

在正力上我肯定会会遇到一些正立的数据集,然后在负利上肯定会遇到一些复利的数据集,复利的数据点,然后当然在边界之外,还有还有很多还有很多数据,那么当阿尔法等于零等于零的时候。

那么就就代表的就是说这个点是在这个,是在这个平行,是在这个跟分类界面平行的一个线上,然后是呃离就是说是是这个分类界面的,是这个分类界面平行的,往正面的方向推推到遇到第一个正题开始,然后就再停下。

然后就遇到了一个这样的知识向量,当然如果是阿尔法不等于零等于零的时候,那么就代表他不在这个线上,这是阿尔法的概念,然后第二个概念就是说,我把我的分类模型本来是FX等于呃,当然这在这里可能缺一个东西啊。

就是缺一个指示函数等于WX加上B,然后我们可以把W给带带入进去之后,然后就就成为了一个这样的一个函数,然后这个是我们最后使用的分类模型,那么在这里我们可以看到,它其实是对于训练数据。

训练数据集中的所有的点,就是R所有的点都在这个计算中去,都在这个计算中,所以当阿尔法就是对于支持向量来说,这个阿尔法是不等于零的,对于非支持向量来说,这个阿尔法还是等于零的,所以就相当于是新数据的分类。

需要和所有的知识向量去做内积,因为阿尔法不等于阿尔法等于零的时候,相当于是这个数据集,这个数据点就没有起作用好这是第二点,然后第三点就就就在于就是说我在训练的时候,我其实是用到了一个所有的一个。

一个数据点的一个内积,好这个是自由间隔分类器,我们带入拉高,我们带入了拉格朗日之后的一个求解过程,好,那么接下来我们可以看哦,那我们接下来再看这个函数,再去怎么这个问题再怎么去求解,就是调整阿尔法。

使得这个函数最大,使得这个这个目标函数最大,然后同时满足这些条件,那这条就比较简单了,已经不算是约约束了,所以在这里我们需要用到一种新的,我们需要遇到一种新的优化方法,叫做,SMO算法。

然后SMO算法跟之前的跟之前之前,可能大家在课上有学过那个梯度下降,还有牛牛顿推导等等的方法,然后SM方法跟他们是略有不同,然后呃我们可以看到它的基本思想是什么,首先我们可以先看一个简单版本。

就是叫坐标上升法,对于对于一个对于一个问题来说,就是我我的W,我有个W,然后这个W是个函数,这个可能是一个很复杂的函数,然后它有很多参数叫做阿尔法一,阿尔法二和阿尔法N,然后我该怎么样去求解这个函数呢。

然后这个这个这个时候用到的叫做坐标上升法,然后这个坐标上升法的基本的思想就在于,首先第一步是,我去不停的去执行下面的这个命令,然后在直到收敛为止,然后下面那个面是什么呢,就是说我对于每一个阿尔法来说。

我都去单独的去对它进行求解,而不是说去对每一个去求解,我们大家知道如果是如果是梯度下降的话,那么它会它会对所有的参数都求出来梯度,然后统一去更新这个梯度,在这里它的不同点就在于。

我在这里我先fix入其他的所有的参数,然后只优化这一个参数,然后把这在当前的参数状态下,我把这一个参数给优化到最好的时候,然后然后再去优化下一个参数,然后这个就是坐标上升法的一个基本的思想。

好那么有一个图示是这样去去去解决的,比如说在一个二维的情况下,再一个就是我们在这里是阿尔法一,到阿尔法N嘛,然后假如说只有阿尔法一和阿尔法二,那么我们就相当于是先先调整一个维度上的,比如说先调整这个呃。

竖竖着的这个位上的阿尔法值,使得它在目标函数上能够达到一个最优值,然后我再我再调整横坐标的,代表了这个这个分量的参数值,然后使得它在目标函数上达到最优值,然后然后我们再我们再去调整。

那个Y轴上的阿尔法值,然后使得它能达到最优值,然后然后再调整X轴上的这个这个过程,这个循环的过程其实就是呃,坐标上升法的这个一个计算过程,好有同学问这是随机推向上吗,就是它不是随机挑选项。

它跟我刚才也说了,就是说它跟随机梯度下降的区别,就在于随机梯度下降,它会同时更新所有参数,就是给所有参数都计算出来呃,都系统出来梯梯度值,然后去更新所有参数,而呃这个坐标上升法它是呃在一个一个状态下。

它只更新一个参数,然后是一下子把这个参数调整到,当前的参状态下,这个W的最优质的的这个这个地方,然后再去调整下一个参数,好,那我们那我们看到的就是这个这个方法,其实是一个比较简单的一个做个生存法的例子。

那么对于我们的这个问题该怎么样去去优化,首先我们再复习一下,我们刚才刚才优化后,就是刚才做过转化后的一个嗯一个问题,然后他的问题就在于求解这个这个问题,调整阿尔法,使得目标函数最大同时满足这几个条件吧。

然后但是在在这里有一个问题就在于阿尔法I,阿尔法I是有是有那个是有嗯限制条件的,阿尔法I乘以Y的西格玛值是等于零的,所以在这里,它并不能够像像普通的坐标相乘法那样,去去调整一个维度上的值。

使得它使得目标函数最大,因为他在这里有一个约约束条件,就是我更更改了一个阿尔法的值之后,我的我肯定会有另外一个肯定会需要调整,另外的阿尔法值,使得这个这个条件要在满足了才行。

所以说SM算法的基本核心思想,就是说我每次都去选择两个变量去进行优化,他跟那个普通的坐标成方法有一个区别,就是说因为他多了一个约束条件,所以他每次选择两个变量,然后因为一个变量变化。

我们再调整另外一个变量,肯定都能使得这个表达式的这个优势条件,肯定还可以继续满足,所以他要这样去解决好,那么我我的算法流程就变成了这样,就是重复上面的操作,直到直到那个直到收敛为止。

然后每次操作是什么呢,就是说我选择两我随机的去选择两个参数,阿尔法I和阿尔法G当然因为是两个嘛,所以I不等于G,然后我我去优化这个最后的目标函数,我去调整阿尔法和阿尔法G,其其实呃跳动阿法I和FID。

其实只只需要动一个,因为你动一个,另外一个可能会自动随着动的,因为它有约束条件的,他有约有约束条件在里面,所以我调整阿尔法I,使得在当前的参数来下W阿尔法是是最大的呃,是是最优的。

呃有同学问阿尔法IG是一个变量吗,不是阿尔法I是一个变量,阿尔法G是一个变量,但是因为有约束条件,阿尔法I乘以Y的西格玛等于零,所以所以比如说我在这里举了个例子,就是阿尔法一和阿尔法二吧。

其实我调整了阿尔法一,阿尔法二也应该跟着在一块变,所以在这里其实我选我虽然是选择了两个变量,但其实是只选择了一个变量好,这个就是SMO算法的一个基本的核心思想,就是坐标上升法的一个变种,然后对。

然后呃可能也是就是今天的今天的,可能今天的主要内容会比较的复杂,然后大家可以分块的去理解,就是就是说比如说呃,可能大家前面拉格朗日那块没有理解,那么我在这一部分SM算法就可以理解了。

那么也是就是比较好的,就是说呃,尽量把这个知识给分成一块一块的去理解,这样会比较快,对有同学说,单词相等式是不是只有阿尔法I和阿尔法G变,对,是的,在SMO算法里面就是这样子的好。

那我们现在已经经过了一个小时15分钟了,然后大家可以先休息一下,我们再讲后面的,然后经历了前面的很多公式推导之后,后面的内容会越讲越简单,希望大家不要走开,然后我们休息3分钟,然后9。18的开始。

然后大家有什么问题,可以在可以在那个在群里面提出来,好我看到里面有些问题啊,第一个问题就在于那个,单次调整时只有阿尔法和阿尔法G变啊,这个问题我已经回答过了,后面调整阿尔法I和阿尔法G的。

这一次是什么时候是停止条件的,停止条件就是呃,在这里有一个阿尔法,A是大于等于的约约束条件,然后这是第一个条件,第二个条件就是说它调整阿尔法I,使得这个函数使得目标函数最大。

啊对有人说是普通的坐标上方法是重复,每一个阿尔法都收敛吗,对是的,他是先有一个有一个最开始有一个阿尔法,就是所有的参数的一个状态,所有参数的一个状态,然后调整其中的一个参数,使得目标函数最优。

然后在这个基础上再去调整另外的参数,使得你把函数最优,等等,然后现在SOM用的多吗,嗯是这样的,就是现在很多问题上,其实都在转用转用deep learning的方法。

所以但是SOM作为一个比较强大的算法,就是他在之前很多年都曾经是呃,欺负那个地方呃,欺负神经网络算法的,所以现在在一些比较传统的问题上,还是有很多用处的,是让谁收敛。

就是让现在我就是现在这些PPT上的这个,目标函数收敛,然后老师现在是做什么工作的,然后我现在这边我是在google,然后我现在是在做呃,就是做两个方向吧,第一个就是就是算法,然后后面还有一个是安卓。

就是说现在相当于是前端和算法都会做,就是说有一个很奇怪的,有的就是很跟跟,可能跟大家的工作的公司不太一样,在google里面就是只要编程合格了,他他就认为你是啥都能做,然后所以虽然我是主。

我的主页是算法,但是也会做一些前端的事情,对有同学说SVM也可以在小M上用,就是有一些问题,比如说你的数据集是比较嗯,可能刚开始没有那么多,所以你可以用来做为M先快速的做一些,做一些实验,结果出来。

算法偏哪方面偏,deep learning就是循环神经网络吧,有同学问调整是不是让偏导都等于零,在这里这其实就没有就没有偏导的这个概念了,因为他看感觉看起来像是一个一个线性的问题。

所以你就直接能找到最大值就可以了,现在图像方面,基本上应该都是基于深度学习的吧,SVM主要文本处理主要在哪些方面嗯,可能用的最多的就是文本分类,好那我们时间差不多了。

然后我们开始继续继续我们的我们的课程,好那么正如我刚才所说,就是后面公式会越来越少了,我们的讲解会越来越清楚,好第一个,那么我们回想一下问题,就是我们刚才讲解问题的时候,所有的问题都在都在说。

都在提前说说这个数据集是线性可分的,那么当数据集不是线性可分的时候该怎么办,那么XYM还可以处理吗,好在这个时候我们可以看一下,其实是这样的,就是说当数据不是线性可分的话,你可以做一些做一些映射。

使得使得这个我们现有的数据,在当前空间下可能不可分,但是我们映射到一个新空间之后,可能就变得可分了,然后就我们就比如说一个二维的数据集,我们做了一个做了一个映射变换,把它把它映射到三维去。

然后就变成了一个这样的数据集,然后这样的数据集其实就变得就是可以区分了,其实呃,比较直观的就是它其实也可以在二维上做变化,比如说他现在是IPHONE11和X2嘛,我在每个数据集都都变成X11的平方。

加X2的平方,那么那么这这这些点,应该都会提升到第一象限中来,然后这些蓝色的点,都会集中到第三间的这个位置上来,所以这也是一种可能的变化,当然映射到三维空间上去,也是一种可以可以实现的变化。

就是说我经过空间变换之后,我可以使得这个数据集从不可分变得更加可分,所以这有一个空间变化的问题,然后空间变化就相当于是本来我做空间变换,就相当于是我对每一个数据点都做些,都做了一个做一个映射。

比如说我有一个函数嗯,比如说我有一个函数是是F,然后FX然后我们在新空间里面那个X6吧,都等于FX,然后做一个这样的变换,然后我再在这个X6的这个数据上,再可以再去构建一个。

再去构建一个SM的等model,然后去去运算就可以了,但是那么有什么方法可以可以,就是我们不显示的做这个做,做这个不显示的去对数据去做处理了,然后就直接在model里面就可以体现出来。

那正好我们也可以看到我们刚才ISOM呃,就是呃简化到最后它形成的问题是这样子的,在这里有有一个有一个续呃,有一个分量是XG和xi的一个内内积,那我们可以在这里就直接对啊,对XG和xi去做变换。

其实就可以了,这个就相当于是我我我本来就是我本来的步骤,是需要把呃X显示的做一个做一个变换,生成一个新的数据集,叫X6,然后在X6上再去做一个,再去做一个XM的model,但是因为我们到最后SM优化的。

最后是一个这样的表达式,所以在这里有一个X,在这里只有一个地方用到了X,所以我在这里直接做就可以了,就可以省掉那个省掉在硬盘上占用的空间,不用生成新数据集了,然后这个是第一第一个省掉的地方。

我们省掉了很多空间,然后第二个就是就是说因为XG和xi,我做了映射之后,可能投射到一个引入了一个叫做合计法,这个合计法其实它的概念就是这样子的,就是说我定义了一个核函数。

然后这个核函数我可以把它看成是两个,两个经过变化后的,两个经过经过空间变化后的向量的内积,然后这个就是核函数的一个概念,好那我们在这里引入引入了它的,我们因为它的定义就是和核函数。

它对应的是一种映射函数啊,这个映射函数可以使得呃,数据集从旧旧的空间映射到一个新的空间,然后为什么使用核函数就大,就就是就是说我映射后的向量,可能维度会非常的高,然后导致内机计算量比较大。

然后我用核函数,我可以比较省略的去计算这个和好,我们可以看一个和函数的例子,第一个,第一个和函数的例子就是呃,贺函数XZ就是在这里,Z是相当于是跟刚才大家看到的,也就是XY和XG吧。

在这里我用一个比较general的方式,就是X和Z,然后它的和函数是X乘以Z的平方,然后把这个式子给展开,相当于是,就相当于是嗯把这个式子展开,就等于就等于到最后的式子,然后我就不一一给大家去说了。

然后这个我们可以看到,我们可以看到它其实就相当于是,我把X和和和Z分别映射到了这样的一个空间,就是在在这里,它最后简化成的函数是X3XG,相当于是相当于是说我把X给变成了一个XI。

XG就相当于是枚举枚举两个分量,然后的乘积,然后那么它的映射函数就是X1X1,X1X2等等,一直到X乘以XN,那么这个对应的映射函数的,映射函数的长度就是N的平方,因为它是从里面任意选两个分量。

然后乘积,好那我们可以看第二个和函数的例子,第二个和这个例子其实就比较,跟刚才那个就稍微变化了一下,就加了一个C,然后相当于是我来这里需要嗯,需要把平方给展开,然后它的对应的函数其实就是这样子。

相当于是我在这里,也需要去对每个平方去做检查,然后然后再把根号2C的这个分量,也就给加到这那个加到里面了,同学们,这是常量吗,这不是常量,ZZ跟X是一样的,是一个是一个是一个向量,都是都是一个数据点。

好那我们我们可以看到就是在做了变换之后,那么这个对应的对应的应用函数,其实都是比原来的的维度要高很多,比如说呃,第一个它的运算函数的,最后的这个呃向量空间其实是N的平方,我们之前是比如说之前的维度是N。

现在就变成了N的平方,然后他的幅度比较大,然后我们就可以看到,和核函数其实是可以降低了计算量,然后另外的一个一个层面,就是就是说X1和X2,其实度量的,其实是在一个在一个对应的维度空间中的。

一个位置的一个一个度量,所以说我可以使用一些使用,使用一些那个其他的相似度的函数去做,比如说在这里就引入了一个叫做高斯函数啊,这个高次函数其实它也是就就算了,距离我我在这里高斯函数的呃。

输入同样是X和Z,然后它的它的表达式是X减Z的二维的平方,然后除以二的这个这个值,然后再求指数好,这个是一个比较常用的和,然后因为他也是去matrix距离的,同学说FX和Z没关系。

对FX和FX和FZ去去再计算,在计算内积,然后KXZ其实就相当于是FX和FZ做内积,好这个是和函数的一个基本的一个思想,然后什么样的和是,啊有同学说怎么样体现计算量的连接上,我们可以看看这个例子。

比如说我在这里,我去求这个和它相,当于是我在XT乘以Z,其实都是在在N维空间里面的,就是,XT其实是一个属于N维的,然后Z也是属于N维的,所以X乘以Z其实就相当于是,它的复杂度是ON对吧。

然后我们可以看到它对应的它对应的映射函数,对应映射函数之后,在映射函数过过变换之后,那么XT他就从一个N维空间,就变换到了一个N方,X6吧等就等于二的N方,等等于空间。

所以所以他在这里如果是XT的变化后的值,变换后的向量和ZT变换后的Z变换后的向量,它其实它的计算,内地的实验法都是ON的平方对,所以这就是它降低计算量的一个一个方法,就是从ON的平方降低成了ON。

当然对于不同的和它映射的空间是不一样的,比如说后面的这个,后面这个高斯和他其实是对应的,一个无限维的空间,然后再在这个时候嗯嗯就不是降低,否则降低计算量的问题,就是说是根本不能算的问题,好到这里。

就就是说呃高斯和对应无限的空间的这个概念,其实相当于是呃,因为对于一个E的指数次方来说,可以通过高数里面的那个叫做呃,叫做,泰勒泰勒展开的一个方法,然后去把它展开,所以是无限维的,好我们继续往下讲。

什么样的和是合法的,然后在这里有一个充分必要条件吧,就是一个定理,然后我就不给大家去去读书了,就是说对于一个数据集,然后它对应的合矩阵应该都是对称,半正定的矩阵。

然后这个嗯我可以说一下对应的和矩阵是什么,核心,就是比如说我有XN个呃,就我一个数据里面有N个数据,有N个数据,N个样本,然后我对每每两个样本去计算,通过这个和去计算一个值出来。

然后相当于是我有N的平方个,然后这N的平方就相当于可以组成一个矩阵,这个矩阵是一个叫做和矩阵,还有同学问增肥后一定会更好分吗,呃是这样的,就是你你作为一个数据集来说,可以这样理解。

就是增肥后不一定不一定马上,不一定肯定是线性可分的,但是肯定会有更大的概率是线性可分的,好,那么我们可以看到常用的核函数,就是一个是多项式,一个是高斯,还有一个是SIGMOID呃。

和矩阵的每个元素是不是常量和矩阵,每个元素都是一个值,都是一个标量嘛,不是常量,这应该应该叫标量,一个数叫标量,一个,标量向量矩阵,好你有多项式的核函数,高斯核函数和西格玛的核函数等等。

然后然后当然还有一个最基础的就是没有加,没有加任何的和,就是就直接算内积的那个那个叫线性核函数,好,那么如何选择和函数,其实其实在所有的核函数里面,其实一般使用频率就按经验来说。

使用频率最高的其实是高斯核和线性核,然后大家可以看到就是可以根据一些呃,从你的数据集上的一些特点可以选择,可以选择不同的和,比如说当你的特征数不很大,但是样本比较少。

然后在这个时候相当于是他的空间已经很很,他就是他的样本数比较少,但是它的空间维度很高,所以我们在这个时候,就一般认为说它很有可能是线性可分的,所以一般用线性盒就可以了,当你的特征数目很小。

然后但样本数目还可以吧,然后然后再在这个时候,我们认为它可能是一个比较空间,维度,是比较相对来说是比较小的,所以需要加一个高斯核,然后当然还有还有最后一种情况,就是当特征数目比较少。

但是你的样本数额特别大,这个时候你可能需要做一些特征工程的事情,然后当然还有一个就是说一个比较好的方法,就是说很多库里面集成了很多的,都集成了各种各样的盒,你可以你可以用交叉验证的方法。

比如说在一个小数据上去交叉验证,看看哪个核是最好的,比如说你拿到一个问题啊,这个问题有100万个数据呃,分成4000位,然后你可以先拿出来100类,然后然后取1万个变量先试一下,看看会不会比较好。

然后再去应用到应用到那个大数据上去,然后当然当然比较高端的玩家,会涉及自己的核的,好那我们可以看到就是SM的用法,正确的打开方式,其实相当于是我,我首先就是SM会帮我确定一个超平面,来进行分类。

但是呢如果他是如果就像我们刚才说的,就是说他在当前的空间,就是求不出来一个超平面,抽出来一个超频段,可以分开所有的类别,但是用它的高度空间的这个操作,S m,并不是说他直接去在每个样本上去去做转换的。

而是说他用了一个核函数的方法,然后既省略了去转换数据集的这个行为,然后又省略了,又省掉了计算量,好那么就是说我们就正如刚才所说,那么我仍然可能就是这个数据集还是不可分的,使得这个数据集变得线性可观。

但是可能他还是不可分的,那么这个时候该怎么办,就相当于是这样,就是他可能有一些噪音吧,就是说每个数据集里面都有噪音,就是说它可能是别的类里面的,然后是混进来这个类里面的特务是吧。

然后但是他他他仍然在其他的类上,相当于比如说这个时间点,你它映射之后还是在还是在这里,然后还是跟跟原来的数据,跟那个跟跟那个复利数据还是在一块,还是混在一块,你不管你头上到哪里,它可能都分不开。

因为它就是噪音的,它它本来就是噪音,所以这这种情况下,我们不能假设呃,我们拿到的数据一定是线性可分的,所以我们一定要考虑到这种情况,然后如何考虑这种情况呢,我们在目标函数上就加了一个加了一个乘法项。

就是说我们允许一些数据点小一,拥有小于一的几何间隔,但是其他数据点还是还是那个,还是大于一的几何间隔,但是这样的数据点是要受到惩罚的,比如说比如说我有一个数据点,它它是小于一的。

然后但是它小于小于小于到什么程度呢,小到一个叫做伊布斯的程度,然后有一个叫做伊布9I,然后这个1592是受到乘法的乘法呃,惩罚项其实比较类似于,如果大家如果大家之前有上过LR的话。

可能会讲到正则项正德画像,然后这个跟那个正常画像其实是比较类似的,相当于是一个多余的乘法,然后他加到目标函数中去,然后相当于是我最后的这个问题,就变成了一个这样的问题,然后这样的一个优化方法。

就是叫做软间隔分类器,就是说我在这里就是不要求,每个数据点都一定是是那个大大于等于的,几何间隔了,好同理,这样的一个东西经过拉格朗日方程,同理这样的一个这样的一个这样的一个问题,经过拉格拉格朗日方程。

然后我们去计算,然后我们就就得到了一个新的问题,然后在这个新的文件可以,大家可以看到,跟跟原来我们没有那个没有软件课的时候,它的区别就在于呃,阿尔法的限制变多了,阿尔法限制除了大于等于零之外。

还要小于等于C,然后这个C就是加在乘法向量的系数,然后然后cc也是SVM的一个比较重要的参数,那么经过了这个之后,那么我们可以看到,其实在SMO的算法它有了更多的约束之后,它其实也变得更加好算了。

就就是说我阿尔法的值,我阿尔法值得选界是有边界的,一个是C1个是零,这只是个示意图,大家可以以理解为主,好那么我们讲了刚才的软件和分类器之后,那么SVM的所有的推导的知识点,应该都已经讲完了。

然后可能就是因为SM的数学推导会非常的多,所以大家可能听起来比较那个比较比较混乱,然后因为我在这里,其实相当于是把每一个每一个SM理解,SM的每一个pass唱的每一个节点都分出来了。

就是最开始讲的那个大家,我希望大家可以分块的去去理解SVM,然后对于拉格朗日方程来说,你只需要记住他的一些条件,还有一些推导就可以了,然后其他部分其实大家用手推一下,其实就能知道呃。

呃其实就能知道最后的SM的推导是怎么样的,好其实后面的核函数还有那个软间隔,虽然推导上没有,没有之前对讲基础的时候那么多,但是他们其实是SM里面很重要的概念,呃有同学问为啥支持向量的线等于一和一。

不是等于其他值,是这样的,就就是如果它不等于一和一的话,那么那么我们可以等比例的调整,W和B使得它等于一和一,所以一和一是我们自己设的值,而不是说它是一个求出求出来的值好,那我们得到了SVM之后。

我们可以看到SYM的M,SVM的问题的数学特性,就是说它优化的是一个二分之1W平方,所以它是一个凸优化问题,肯定会有一个全局的最优解,然后它的特性就在于它可以处理高维数据。

比很高维的他只要算内地就可以了,嗯然后它的软间隔可以,其实也也可以起到一些过敏,降低过拟合的作用,然后嗯啊而且有个重要的重要的特点,就是它就是说它求解问完成后,它的它只有少数数据起作用的。

就是那些支持向量,就是阿尔法嗯,不等于零的那些向量,然后还有一点就是说它因为有核函数的概念,所以和核函数是可以设置很多的,就是你可以自定义和函数等等,你可以有无限的空间去选择合函数,然后有同学问。

有同学问管金额是为了增加模型,泛化能力和函数是为了更好的分类也对吗,对和函数其实就像有同就像下面同学说的,就是它还可以减少计算复杂度,对这两个都是,然后软软间隔主要是呃兼容那些就是不可分数。

预计的起作用的,其实和函数和软间隔也都有,那种就去兼容不可分数,去去解决不可分问题的,不可分数据集这样的问题的一个一个方法,有同学说得到了支持向量后,那其他向量就就没有作用了,其实是这样子的。

就之前我在那个有一个PPT上也讲过。

对在这个PPT上大家可以看到,其实因为我的不是非支持向量,它的阿尔法都是零,所以所以只有支持向量才会起到作用。

好那我们继续往后讲,其实除了刚才的那种方式之外,还有另外一种方式去理解SVM,然后这种方式就就叫做合一选择函数,然后我们可以直接去看这个损失函数是什么啊,就是它的损失函数其实是这样的。

就是对于对于一个数据点来说,如果它的如果它的几何间隔是那个是大于一的,那么它就是嗯那么我们就先不管它,如果它的几何间隔小于一的,那么我们就去调整参数,使得它的几个间隔变得大于一,这个恨直到这个回血。

等差数的意思就是这样子的,然后我们可以看到呃,其实主要的主要的精华就在于,一减去Y乘以W乘以乘以WX加B这一块,然后一大家可以看到Y乘以WX加B呃,其实就是就是那个就是几何间隔嘛。

然后就是几何间隔合一去做做减法,然后在这里有一个损失函数的一个变化,就是说呃有一个有一个函数吧,叫Z加,然后这个最佳,这个其实跟呃跟那个神经网络里面的软路函数,其实是一样的,就是当Z大于零的时候。

他就他就是他就是Z,当Z小于零的时候,它就是零,所以什么时候C小于零呢,就是说几何间隔是大于一的时候,一减去它就小于零了,然后当几何间隔小于一的时候,这个这个数就是正数。

然后这里面后面有一个W的二阶范数,然后这个二阶范数就相当相当于是一个呃,这个是一个正常画像,然后通过这个loss,我们去我们去那个我们去呃做梯度下降之类的,然后就可以去求解这个去求解呃,去求解SM。

然后这个是一个是SM,从损失函数的角度,然后去又得另另外一种理解方法,但是通过这个这样的理解的话,我们我们既引入不了和那个合计法,也引也引入不了软软结构分类器,所以它可以作为一种补充材料,放在后面。

放在这里,然后我们可以看到这个横着loss它的,它的它的方程是这样的,就是当,应该是当几何间隔了,对它下面的图是这样子的,就是还是说就是当当那个几何间隔,是是那个小学一的时候,我就去考虑它。

就是它相当于是他离分错就不是特别远,然后我就去考虑它的超算函数就是这样子的,然后它几何间隔是大于一的时候,它就是零,然后在这里有一个有一个另外的一个,就是真实的,就是最原始的那个零一损失函数。

其实是这样的,就是当X小于零的时候,它就是一,当X大于零的时候,他应该是零,所以相当于是这个函数是那个是零一损失的函,001损失函数的一个一个一种拟合手段,它跟那个西格玛的损失函数是类似的,好。

那么我们刚才讲的SVM,它其实都是支持的是二类分类,然后呃对于多类分类来说,他该怎么支持呢,其实有很多种方法,第一种第一种方法就是说对于N分类问题,然后我可以我可以用一对多的方式。

就是每个类和剩下的类去做去训练分类器,这样我需要训练N个分类器,然后然后去去得到那个最后是哪个是哪个类别,这是第一种方法,第二种方法是一对一的分类器,一对一的分类器,就相当于是我需要串出来。

二分之N乘以N减一个分类器,然后这样这样我就可以对每个分类器,我都去投票,然后相当于是到最后哪个类别得的票数多,就就属于哪个类别,第三个就是用层次,用层次的方法,就是就是说我把我首先把类别分成两个部分。

就是比如说我有100个类,然后就首先是这50个类和这50个类,相当于是呃把100个类分成两部分,50类和另外五之类,然后这是一个二分类器,然后对于这50来说,再再去做做二分,就是分成25个类和25个类。

然后再去训练一个分类器,这个是一个层次向量层次支持向量机,然后这个就需要log n个分拣器,然后在现实中,然后呃一般来说就是呃,在一般的SOM的开源库的实现,一般都会实现一对一和一对多的人理器层次。

知识分类器好像用的不是特别多,好那我们后面就到那个实战环节,然后啊对可能有的同学说的对,就是时间占的太多了,前面安排的内容比较多,所以后面到实战的时候嗯,时间比较少,你可以看到呃,我们解决一个经典问题。

就是SVM需要呃可以去解决的一个经典问题,就是文本分类,然后之前在我记得我上学的时候,应该SM解决文本分类,还是一个比较经典的比较主流的算法,然后再在那个时候大家都用SVM去做分类。

然后基本的方法就是课程工程加上分类,就是特征工程,就是说我先把文本给给表达,成向量的向量的样子,然后再去用SM去做分类,然后就可以解决这个问题了,但是现在比较主流的方法就是用深度学习。

就是直接把文本输入到神经网络中去,然后直接得到一个分类结果,也不用提取太多的特征,但是两个各有优势啊,不是说生命机会一定好,然后SM它也有表现好的是吗,好这个是我之前参加过的一个文本分类的比赛。

然后是在13年的,然后他的基本问题就是1000万条33类,然后去去去做分类,然后但是会要求算法基还都不去实现,然后我得到的结果是97。65,然后当时比一等奖就是整整差1%吧,然后是因为特征向量没有做够。

特征工程没有做够,后面会讲特征工程在哪里没有做够,首先文本分类的主要流程,因为时间不多了,我就直接简单给大家过一下,就是第一就是分词,当然大家可能也都了解,就是对于中文来说。

所有的NLP任务都需要下分词,才能做到一些比较好的效果,然后就是特征筛选,特征筛选有两步,第一步是去除停用词,就是把一些没有没有那个没有真实意义的,比如说语语气词和助词。

比如说像的像呃阿妈爸这样这样子的,以及助词什么的都去掉,第二个就是我可以去计算特征的重要程度,就是有很多特别选择的方法,然后可以去给每个特征去计算一下,然后把特征程度比较低的给删掉啊。

然后在大家使用SM的时候,特征选择也是一个比较重要的topic,然后就是我把分词的结果,然后经过筛选之后,然后会有一个新的新的结果,然后这些结果呃,再去给每一个词分配一个id,然后把它表示成一个向量。

就是相当于是每一个每一每一个文本,到最后都转化成是一个向量,这个向量里面,每个分量就代表的是这个词出现了多少次,或者是这个词的重要程度是什么,然后再输入到HSVM中去做训练,好这是特征选择的几种方法。

大家可以去了解一下,好那我们就直接看到,就是我当时调参的一个呃对SM调对整个项目,对整个比赛的问题,调仓的结果,第一第一个就是就是说,因为我是33分类的嘛,然后我是那个我最后是用的一个组分类的方法。

就是说就类似于嗯,类似于那个层次知识摄像机做多分类,但是我把很多类分成多个组,就是比如说33类,然后每四个是一组,分成八组,然后这样再去一对一的去训练分类器,然后再去投票。

然后然后就是分词上面有两种分词方法,一种是细粒度分词,一种是就是粗粒度分词和细粒度分词,之前用这种的,用这种的时候,虽然感觉分词分的还可以,但是呃用细粒度分词之后,确实是可以提取出来更多的特征。

所以用细粒度分词可以提升0。8%,然后最开始的时候我是用的嗯用的那个瓷瓶,作为那个作为向量的嗯,作为向量的值,后来把词频替换成权重,权重就是可能是TFIDF,然后可以提升0。02。

然后FM的参数你可以去尝试各种盒,然后嗯各种设置,然后可以提升0。2%,然后去除填充词,可以提升0。04%哦,有同学问我多大保密,好大家可以看到,其实我已经做了很多的挑战的工作,但是其实还没有做到位。

因为确确实实,第一名的方案跟我的就是在模型的,在模型和实现上其实没有什么区别,但是他在那个他在他在特征提取上,确实能能做到比较好的效果,然后他可能提取出来是比我用的更细粒度的。

比如说他对于一个词它会提取,它会提示各种各样的嗯子特征,第一个就是有生日蛋糕,它可能会在对这个词再做一些组合,有生日蛋蛋糕,就是还有生日这样的词都提取出来,然后还有就是他做了一个engram t组合。

就是就是说比如说分成代词,就天津天津新开河,天津新开新开河街房价,然后他会把天津新开河街,还有天津房价,新开新开河街房价都都做,都做组合,然后最后到最后它的特征数目是非常大的,一个数是750万的一个数。

然后我在这里提出来的特征应该是不到30万,所以它的特征数是远大于我的,所以他能够得到第一名的效果好,然后这个就是后面的一个实现,然后还都不实现,然后我就不给大家再细过了。

好我们直接看一下今天的那个实战代码,有同学问模型效率怎么样,是这样的,当时是在海图上去实现的,然后都在set up上,所以应该最后实现的虽然是1000万条,但是训练时间应该也只有不到一个小时吧。

好那我们看一下,就是今天的,你可以看下今天的这些内容,在在这个文件夹下,其实还有一些那个还有一些IOSTM和,CNN的一些一些model去串文本分类,然后这个就不是就不是我们课程的范畴了。

那就先看一下我们的数据是什么样的,然后怎么样去用到SVM中去,第一步就是就是说,我先我们先看看我们的现有的数据,其实数据都是这样子的,就是我是,我现在是用了一个一个新闻分类的一个数据集。

然后这个数据里面有十个类,然后分别是体育啊,政治啊之类的,然后他的他的数据是这样子,大家可以看到啊,就是第一个是label,Label,后面跟个tab键,tab键之后是新闻的,新闻的内容。

然后我在这里有一个有一个文件,去去对它进行分词,对在这里有一个文件叫generate word level data,那我去先去对它去进行分词,然后分词之后分词我在这里是用的结巴分词。

然后因为之前我相当于是我的数据都是create level的,但是没有分词的,所以我的我把它命名成create level,哦然后在这里有一个函数。

然后这个函数generate generate wordfile,输入和输出文件,然后在里面调用接调用结巴分词,把它分词成一个呃,分割成一个分分词后的结果,然后再把它写入到一个文件里去。

得到分词后的结果,有同学问J8是什么,J8其实就是一个分词的库,叫结巴分词,是个Python库,大家可以去装一下,当然大家也可以用中科院的那个HTCLCS也哭,好这样我就得到了。

这样我就我就得到了分词后的结果,就是每一个相当于是在这里对他都进,都进行了分词,然后分词之后,上次之后我还有一个生成词表的过程,为什么要生成词表嗯,因为是这样。

就是呃我们到最后需要输入到SVM中去的模型,是那个什么,是呃输入进的SM中去的数据其实是向量,所以所以我需要给每一个词都呃,都分配一个ID,所以我需要一个词表,然后这个词表这个词表里面能喷一个。

就是保持一个映射,这个映射是词语到id的一个映射,然后呃到最后,所以说到最后每一个文本,它对应的是一个是一个向量,这个向量的长度是词表的大小,然后里面那个相当于是一个文本,然后比如说他有有某个词。

我们对吧,由于这个词,然后我们这个词在词表中它的id是15,然后那么这个向量这个这个长度为,比如说我们有此表个数是1万,然后这个长度为1万的向量,就是在15的那个地方是一有对。

如果我们如果是以次评为为那个为值的话,那就是一,如果如果我们出现两次的话,那就是二,所以在这里生成生成一个词表,然后生成完词表之后,生成忘词表之后。

我会用这个word level feature的这个Python notebook,然后去去把每一个,去把每一个每一个分词后的结果都转换成向量,在这里我会,我会把词表都读进来。

然后成为一个就是给他每个都上一个id,然后这是dict在这里,然后然后把这个feature DK传进来,对于对于那个对于后面的每一个文本,就是对于那个分词后的每个文本我都去查找,说这个词有没有出现过呢。

如果出现过,我就给他个id,然后把把value也也写进去,然后就会生成一个生成一个呃,乘上一个id id号,然后value的一个值,好这个是这个函数的作用,然后我们可以看一下最后生成的结果。

作胜的结果是这样子的,就是说我对于每一个类,然后它出现过的,就是所有的不为零的值都要显示出来,好有同学已经问了两次了,就是说海杜普和spark推荐哪个啊,现在来说。

海杜普和就是分布式的机器学习已经成为主流,所以肯定是要学一个,还还都还是要学一个,那个分布式的文件管理系统,然后还有一个是分布式的机器学习算法,所以呃但是对于分布式机器学算法来说。

海德博斯SPK其实都被证明了,是不是不太适合去实现分布式计算法,所以推荐大家使用那个就是学那个parameter server,他们的server叫就简称PS,然后嗯然后它是一种分布式的机器学习框架。

然后在TENSORFLOW里面会有集成,所以可以去学TENSORFLOW,然后对于文件系统来说的话,其实学海图谱应该就够了,所以不太我,因为我从来没用过,没用过spark。

然后当时我用过map reduce,所以推荐大家去学海德堡和tc flow好,这个是生成的最后的文件,那么生成的最后文件,是怎么样输入到那个SVM中去的,我们可以看这样,我们在这里有一个。

就是我下载了一个lib s v m的一个包,然后在这个包里面它会生成很多个,它它有那个sm predict和sm train,然后这两个是那个是用来串model和做predict。

所以我写了一个bus脚本,然后这个拍脚本,可以把刚才我们生成的那个下载的文件,可以做处理,然后做完处理之后,然后去用SVM去做,去做做训练,在这里可以看到,其实我趁用了很多参数。

杠S杠C杠T杠G杠E等等,然后大家可以看它的各个参数的含义是什么,在这里其实可以在这个read me file里面,其实大家可以看到很多,比如说杠S其实就是SM的type,然后gt就是核函数。

so ym tab可能就是不同的实现吧,比如说它多多类的的实现,然后还有那个呃两两类分类器实现,然后核函数的话,他现在支持线性和多项式和,还有那个镜像积函数,就是高斯函数,然后还有SIGMOID等等吧。

然后还支持自定义盒,然后好,下面这些杠D杠,G杠二都都是那个都是上面不同的和,就是不同的盒会有不同的参数,然后下面有一堆,然后有一个杠,有一个杠C,杠C其实就是我们讲的那个软件的分类器。

里面的那个那个就是对于错误的分类,就是噪音的数据,它不是有惩罚项吗,惩罚项有个系数是C,然后这个C就是那个的参数好,所以在这里是有这些的的函数,然后通过我的这个这个脚本就可以去冲。

然后这个是我给大家实现了一个,实现了一个用脚本计算的方式,所以我们今天的homework,其实是那个是是要求大家是导入到,因为lip s v m它有一个Python的包。

所以今天homework就是希望大家能去呃,能导入那个Python的包,然后用Python代码去实现今天的分类结果,然后呃今天的那个数据上的分类,然后数据其实我都已经帮大家处理好。

大家可以直接在直接在那个数据上,直接导入那个数据,然后去进行串就好了,然后我这边串出来的结果,我可以跟大家展示一下,在word level上,在word level上,我那个什么我我有不同的参数。

就是这个大于20,大于100,大于200是什么意思,就是说我对于视频做了一个filter,因为我之前不是用了很多种方法吗,就是呃跟大家讲了很多特征选择的方法,然后我在这里用了一种比较简单的。

就是就是视频呃,用spin去filter呃,小于出现小于24个,然后就直接filter掉,然后可以看到它的它的效果是是百分之test,94啊,value的值是92,大家看到其实把四把这个数调大一点。

其实可能对分裂结果也没有太大的影响,都是92和94点多,然后同时我到这里还冲出来一个create来,我就是我们之前不是说分词吗,然后如果不分词,把每一个值都当成是一个,把每一个字符都当成是一个特征的话。

那么它的结果是这样的,就是91和93,这边是92和94,对然后大概的结果是这样,然后也希望大家写code去实现的结果,应该应该也能达到这个也能达到这个预期,然后有同学问其他库可以吗。

其实这些库都比较都比较类似,所以我还是建议你用LIBSVM,或者或者还有一个可选的,就是你可以用live la,是live s o m对线性盒的一个优化版。

我之前那个做比赛就是用的live lander那个库,好然后这个是今天的notebook。

好因为时间已经超了,然后后面的这些我就简单的给大家介绍一下,就是说在文本分类领域,然后有一个很很什么的问题,就是很很流行的问题,就是不平衡,根本分类这个其实很常见,就比如说呃我之前在腾讯的时候有做过嗯。

色情文本就不是色情嘛,就是不讲文本分类吧,不一定是色情的,就是有色情的,还有那些就是,骂人的话等等都是需要FS掉的,所以但是这些话相对于腾讯的所有数据来说,他是一个很少量的。

所以说他对于这种分类是一个是一个很强大的,就是一个不平衡性很强的一个文学分类问题,好然后对于这个问题,其实我们需要做很多种方法去去去优化它,第一个就是说对于不对于那个不平衡问题来说。

就是不仅仅是文本分类上,对于其他问题上所有的不平衡分类问题来说,都有很都有很多种通用的解决方法,第一种是重采样,就是说呃可能对多数样本去去做降采样,就是去选一些样本,对少数样本去做上采样。

上海那就是说我把样本复制很多份,把少数类的样本复制很多份,形,形成一个跟多数类样本差不多的一个,一个那个一个比例,然后还有一个叫smooth算法,smoke算法,其实跟其他的下载量和下载量差不多。

但是它是自己生成样本的一种方式,就是说它会通过训练数据集里面已经有的样本,去再重新生成新的样本,这个是数据层面,我会做这样的一些事情啊,对当然还有一个就是训练集划分,就是我把大类划分成划分成很多子类。

很多子子集,比如说比如说正常的样本,我可以分成十份啊,像这样的话,这个样本数这个,然后这个样本比例,就相当于是降低了原来的1/10了嘛,然后然后我再把少少数类的样本。

和每一个大类子样本都去训练一个分类器,然后这样这样再去到最后再去做投票,那么这是训练集层层面的一个一个建模,还有一个就是在传统在算法层面,大家可以用用一些,比如说在算法领域可以对少数类去加权。

在损失函数里面就说如果少数类分错的话,那么我可以使得它的惩罚变大一些,这也是在算法层面中的一些改动,还有一些就是就是多层分类,嗯还有到后面就是规则,机场就是到最后可能你拿到的一个最后的的model。

是不仅仅是由你的分类分类model在里面,可能还会有一些规则在里面,比如说有很多很明显的filter,就是很很多敏感的,这个是一个很重要的一个,第一个事情是宁可错杀100,不能放过一个的一个事情。

所以说可能到最后的model,还会有一些规则进行的东西,大概是大概对于不平衡,不平衡的分类问题,大概有这么有这么多的解决方法,然后啊在这里因为不是本节课的主题,所以就给大家简单的带过一下好。

那我们总结一下今天的今天的嗯,今天的主题第一个就是我们推导了SVM,然后呃,重要的一个就是SVM公式化的一个一个变化,就是说这个问题,从刚开始的一个简单的函数间隔呃,要求函数间隔最大值的一个问题。

转化成到最后是一个很奇怪的一个表达式的,一个中间的一个的转换啊,大家要理解中间的转换到底是哪一步,是为什么可以这样做等等,然后然后为了求解最后变换后的那个问题,我们引入了拉格朗日的一个数学知识。

然后这个数学知识,然后可能大家不是特别理解,然后记住就可以了啊,然后嗯然后我们讲了最大线性可分的,最大间隔的分类器,还有软间隔的分类器,然后同时还给大家讲了合计法,然后应该这些就已经把SOM的。

所有的东西都讲全了,但是可能今天那个就是呃SM内容比较多,然后时间比较少吧,然后可能有一些没有给大家讲清楚啊,在这里也非常呃给大家嗯很抱歉,然后呃但是本来就是这样,就是SM作为一个复杂的算法。

可能就是大家一次也可能也理解不了,需要大家看很多次才可以好,然后最后我们带大家做了一个文本分类的实战,用live s v m去处理一个十类的新闻数据集。

然后呃然后呃用命令行的方式去运行live s o m,得到了分类结果,然后homework就是希望大家能够用那个用引入Python code,Import in python code。

然后用Python code去实现这个算法,然后希望能达到92%到94的一个,一个分类的效果,然后大概是这样,然后嗯对就像我刚才说的,其实SM的理解不是,也不是说一朝一夕就能理解的。

然后死背也不是一个特别好的方法。

然后希望大家就像我刚才说的,就是就是我在最开始的时候列了一个,列了一个就是pass,然后这个pass就是各种知识点,然后大家可以分类,就是每一个每一个知识点都理解了,就是去去去一个一个的去去去解决。

你不理解的地方,然后嗯然后试着自己手动推导一下,应该到最后应该就能理解了,好然后今天的课程基本上就是这样,然后现在是超过了13分钟,然后嗯大家可以再提一些问题,然后可以再回答一下,然后回答完之后。

大家拿好这门课就可以到此结束了,啊好看,大家还有没有什么问题,啊对现在是在雇佣中国啊,如果有兴趣来面试的话,欢迎发奖励给我,但是google的面试可能不会问太多机器学习的code。

耳机学习的东西可能更多的是偏向于代码实现,就是呃面试比较比较那个比较偏算法,然后实战代码在没有在群文件,我之前有发过一个百度网盘的link,然后呃后面我会把,后面我会把那个数据集也传到那个群文件中去。

拉格朗日是哪两个条件内积,怎么切换这个函数的一个一个解决,是这样,就是内机怎么切换成横函数,就是你直接把这个放在一部分,用这个KXZ给替换掉就可以了,Sorry,给替换掉就可以了,就是把三对一的部分。

就直接用和函数的值给替换掉,因为这里算内积,它其实也得到的是一个数嘛,然后KXZ他得到的也是一个数,直接替换掉就行,然后拉格朗日是哪两个条件,拉格朗日有有两种条件,第一个条件就是说。

它的约束条件是要求是凸函数和反制函数在后,然后在这里,然后在这里,然后除了这两条件之外,然后还需要满足一个叫KKT条件,KKT的条件就是最优解要满足KKT条件,然后才能使得对偶问题和原始问题是等价的。

SM的基础呃,是这样,我见过的最全的一个基础,就是李航的那本统计学习方法上SVM的讲解,所以如果大家如果大家想要去完整的去了解,SM的推导的话,可能看你行,那本书会比较好,然后第四集的图优化。

我觉得也可以去看一下,但是我没有看过,不知道它里面讲的都是些什么,HW和GW都是HW和TW,都是都是那个约束条件,HW等于零,GW小于等于零,都是都是约束条件,然后一个算法团队怎么分工啊。

我之前在百度做的时候嗯,这个创作团队一般都会分成model,团队和特征工程的团队,model呢就就负责实现就是怎么使得model更SCALABLE,然后然后加一些模型的改进等等,特征工程的部分。

就很显然就是大家去提特征什么的和函数,其实也不需要去讲数学知识,因为它没有数学知识,它只是一个替换,对问题是这样的,就是说SM的求解,它其实是使用那个,使用极大极小的这种方式能够能够才能够求解。

极小极大的方式是不能够求解的,所以说我需要使得那个我,我我需要在求解SM的时候,使得他这个最小极小极大问题,变成极大极小问题,所以说这个是对我问题的一个目的,就是然后恰好SVM它它它能够使得他的是SM。

它恰好能够使得最优解能够满足KKT条件,然后所以就能够使得那个SM,能够使能够使用对偶问题求解出来,用来训练的特征,其实就是我刚才说的嗯,很多种方法,文本分类里面TFIDF视频文档频率等等。

这个是文本分类的特征选择方法,如果是对于其他问题的话,就要具体问题具体分析了,比如说有有有很多做特征工程的一些呃,一些经验吧,可能,为什么支持向量的阿尔法大于零呢,这个是在求解之后才能去得到的。

阿尔法阿尔法大于大于零,是指的就是在求解完之后,大家发现就是阿尔法呃,大于零的地方就是支持向量的地方,但是在理论上来说就是说呃从理解上来说,就是对于几何间隔最大化,这个也是就是就是说呃。

其实对于不在那条线上的呃,不单单不单单向导数据数据,它其实对于那个整个分类界面的确定,其实也没有呃,没有没有贡献,基本上,所以只有在在那个只有知识向量,才会对那个对分类界面的确定呃,会起作用。

所以这也是阿尔法大于零的一个从问题,从问题的角度去理解的一个思路吧,对偶是用来优化目标函数的,是的就是我们讲对偶问题,就就是为了要用那个要用那个队友后的,队友后的解决方法,去去求解那个SVM最后变化的。

最后转化后的那个问题嗯,好然后关于SVM,我在我的博客中,然后会有三篇是介绍SVM的,然后大家如果感兴趣的话,可以去看一下,当然是比较早期的的播客,为啥先求极大,就不可以,因为先求极大的话。

应该是先求极大,大家就发现就已经抽不出来了吧,好啊,大家看看还有没有其他问题,如果没有其他问题的话,那我们这次课就暂时到这里,然后嗯SM在那个什么在实际使用中,可能现在是呈现一个。

就是逐渐会被define取代的过程,但是他在面试中也确实像很多同学说的,面试过程中肯定呃有很多会被问到,所以希望大家能对这方面的知识也有所理解,但是呃也不一定就是上不上上不转的,山不转水转。

然后之前是SM嗯比较高调,然后现在deep人就上来了,然后也说不定什么时候,又一种SM的扩展方法才可以杀回来,所以理解这方面的知识,也会对大家学习学习也会有很多的帮助,现在SM的嗯应该没有那么多了。

之前比较多,我我13年的时候,我见大家还普遍还在用SVM,那在那个时候我面试的时候不问SVM,简直要逆天了,但是很奇怪的就是说现在DEFI经这么火了,大家还在问SUV,这也是我觉得比较奇怪的地方。

好然后看大家也没有什么问题了哦,对还有一些问题,google招聘侧重编程算法,对google招聘确实侧重编程算法,然后怎么提高这种能力呃,数据结构算法,然后去去刷题吧,去刷这个扣子。

然后如果能刷过两遍的话,可以把简历交给我,当然也不只是刷题,就是就是说可能更关注的还是要那个什么要嗯,八个free的代码,就是说你用用在一个在一个text上,再一个就是在一个文档里面可以直接扣的。

然后扣出来一个基本上没有没有bug的代码,我刷了多少题,我刷的题比较少,我只刷了100多万,model是怎么上线的,model其实是这样的,就是嗯对于很多模型来说,它都有一个线上的服务。

然后这个线上的服务呢是部署在很多机器上,然后如果你要替换model的话,就是呃会是一个机器一个机器的去替换,然后当然还需要做a b test,就是来证明你的model是有效的,然后证明了这个之后才会。

比如说modetest a b test是在10%的用户上,然后那model在这个上面证明了是有效的,然后再逐渐的push到30%,50%,其实model的更新就是你在勾起了server之后。

然后相当于是更新的时候,只要把model替换掉,数据文件替换掉就可以了,想用开告来想来作为项目经验面试可以,如果你的拍照项目排名比较好的话,应该应该可以。

一般招聘对depending方面的职位会有啥要求,我们现在呃不知道其他公司,google的话,AI center招聘发件方面就必须有一篇顶会paper,至少一篇,但是其他很多公司应该不要求这个。

只要项目有就可以了,机器学习会饱和吗,我目前认为应该不会,但是我说的应该也不太准,但是嗯怎么说呢,就是说现在这个行业应该是属于刚刚兴起,所以我觉得缺口还会很大,所以学这个是嗯还是很有必要的,回归中国。

这个我也不知道,我希望他能回来,但是我不知道中国的新学期处于睡眠水平,什么意思,其实是这样的,就是孙楠转行的多,但是呢呃但是合格的人比较少,其实各大家去找工作什么的,各行各业都是这样。

就是就是说嗯可能竞争很大,但是呢但是就是合格的人比较少,尤其是呃就在我们在我们这个行业,不管是做去做编码还是去做研究嗯,都是都还是挺需要那种就是合格的人才的,所以不用担心大家。

只要只要能够保证自己是优秀的,然后肯定就不用担心明天的课程,大家去课本上看一下,我给大家看一下,明天是最大商em什么的,但是明天就不是我讲的,是其他老师讲,好然后看大家没有太多问题了。

然后后面我们有有时间再在QQ群里面再继续聊,然后好,那么今天的课程就到这里,感谢大家,已经过了半小时了,还在这里听我唠叨。

1447-七月在线-机器学习集训营15期 - P8:04-CV-4-行人重识别项目(ReID)模型优化迭代及总结 - 程序员技术手札 - BV1ASste6EuZ

那时间到了,各位同学,我们开始我们今天内容了,然后对啊,大概三个小时之后可能就是双11对吧,那我们跟直播的同学,我们再稍微这个呃聚精会神来听两小时的课,然后迎接双11,正好嗯。

那今天我们就是进入第四次的我们的项目的啊,课程就是我们的raid,那在前面三次课程,我们分别从我们的项目的背景,还要我们去建立一个训练的一个CNN的一个呃,Baseline model。

然后包括我们的data loader怎么来写啊,每一行,然后以及昨天啊,前天晚上我们进入到了evaluation的这个阶段对吧,然后我们再来回顾一下evaluation的整套的代码。

然后我们接着今天的讲啊,原来UTION我们写了不少了啊,啊对然后这个我们说从前面的这些啊,query和evaluation的这个数据的这样一个解析,没什么好说的,这个跟我们第一次课的内容啊啊比较相似。

对吧啊,读到GARY和我们的query的图像,只不过在这里我们的再次强调,就是我们的query的image id,和我们的训练数据集的啊,image i id是啊不重合的啊,这个我们之前解释过好几次了。

我们不再说了,然后我们就要load我们的model,就是我们在训练好的那个模型啊,那load我们的model的时候呢,那load model的时候呢,我们是不是说嗯。

嗯对于啊loss函数的这样一个构建啊,我们可能有两块,一块是我们使用内置的loss函数的构建,所以我们直接load model就结束了,还有一个呢就是呃。

如果说我们使用了一些customize定制的一些model,那么我们的模型的其实就会有这个cross呃,就需要去这个custom的objects,作为一个字典加进来。

就是我们的CROSSROY的label smoothie啊,这么一个东西,然后对于嗯接下去之后我们就是会啊,load完了模型那给了一个输入,是不是我们就可以拿到这个feature的输出,我们说啊。

我们model点summary这么一个东西是非常有必要的,因为有了它之后呃,我们就可以通过get layer的这样一个方式,去拿到什么呢,中间任何一个啊信息啊,这里我们是通过name的方式去拿到的。

某一个layer的啊输出,那这个name怎么来呢,其实就是通过model点summary你就可以看到,然后当然这里举了一个例子,只是拿到某一个啊。

这个最后一个global max pulling之后的结果,那你拿到中间的任何一层也OK,比如说啊com1多少,什么样的这样一个啊,雷尔的名字好吧,然后呢我们就会构建一个新的模型。

也不是构建一个新的模型了,其实就是我们在定义一个新的模型,这个模型呢就是做特征提取的,因为在原来我们road那个模型,我们的输入是一张图片,输出是他的feature id对吧。

但是我们现在我要求我的输出,其实不需要去feh i id,没有用呀,我们希望什么呢,我们希望我们的输出是一个这个这个这个呃,feature啊,所以其实就是输出是dance feature就OK了。

所以我们就会新建这么一个model,OK啊,新建这么一个model啧,然后依然就是在我们的机制里面,为了使用它,我们需要去啊啊,我们需要去对它进行一次这个compile。

所以我们依然会要定义一个optimizer,当然这个optimizer其实就给他一个面子,走走过场对吧,那也不会用到它,然后我们的compile一下啊,那就OK了。

然后我们直接就可以用这个模型去predict了,那呃我们可以复用我们之前说过的啊,我们的这个generator,只不过在那generator那个里面呢,我们稍稍做了一些小的修改,本来是yo的X和Y对吧。

那在这里我们只有yo的X了,因为我们要去预测那个Y1撇好,所以这样的话我们就啊可以得到我们的啊,query的generator,OK然后根据刚才我们定义好的那个model呢,我们就会把这个啊。

query的generator为进来做输入,然后我就会得到query的features,Ok,然后啊,我们对我们的这个query features,做一次normalize。

OK然后呢GARY的generator以及GARY的feature啊,一样啊,如法炮制,以此类推,然后normalize一下啊,然后这个GARY的这个feature好,Ok,然后一样啊。

好那这样的话我们就已经啊基本上基本上已经,啊这个前置的这个条件,我们基本上完成的差不多了对吧,差不多了,然后如何啊,往后面走,那其实就只剩几行代码,我们就可以把它写完了啊,你可以看啊。

就是我现在上次是说了,就是我们可以得到一个similarity的一个矩阵,对不对,那这个similarity矩阵其实是通过我们的query,feature和gary feature来进行product。

对吧啊,当然我们是通过矩阵的方式product,然后我们通过transpose一下,我们就可以得到,所以我们可以把这个定义成什么呢,定义成,similarity的这样一个matrix吧对吧。

就可以得到这玩意,对不对,对然后我们对其中的每一行呢,我们其实都可以通过啊,这个排序我可以得到一个arg max,对不对,那这个arg max呢其实就是我的识别的那个id嘛,所以很简单啊。

你就可以得到这个index的这样一个list,当然这个list其实是每一行组成了一个矩阵对吧,所以我们依然可以用,啊AI g salt来进行salt。

它。

然后这样的话是从小到大来进行排序,对吧啊,从小到大来进行排序,那你可能需要来反向来,就是啊这个就是把它逆序一下,当然这个操作也没问题,但你还可以这么操作,就是为了简单啊,你从小到大也没问题。

你就定义一个distance matrix呗,不就是一减去这个similarity的matrix吗,对吧,这样你就不用去那个倒一倒倒那一首对吧,好,然后这样是不是其实你就能做evaluation了。

对吧啊,接下来代码我们就交给大家自己了啊,啊接下来的逻辑呢非常的清楚了,这个逻辑是不是就是,each吃肉,In i d x,Is a prediction,对不对,并且呢,IDX的。

每一行的第一列大家说的是什么,想想看每一行的第一列是什么,每一行的第一列其实就是我那一个sample,就是我的那一个预测,Query,他预测出来相似度最大的那么一个id是什么,对不对,当然。

这里的id啊应该是他的123456的这个id,对吧啊,这个是没有问题的,所以其实它是is the index of the pre,id对吧,所以你要通过这个id呢去找到什么呢。

找到额这gallery的gt,这个很简单吧,这个之前我们就已经有了,所以其实你就可以算一个top one accuracy对吧,比如说,对吧,然后你可以写,对每一个query区来进行一个处理对吧。

比如说啊,好吧,那这个query的id是什么呢,就他实际上这个id你是不是能够取到这个gt,很简单吧,你可以通过parate name,这样你是不是就能去到了,我们去之前说过了对吧,好,然后很简单吧。

在某个时刻你肯定要对这个啊,给一个判断对吧,他到底是比如说零,还是一对吧,然后跟你的top,AACC你需要有一个交互对吧,就可能要加这个predict,然后最后呢你的top one。

AACC可能你要除以整个什么呢,宽长度对吧,你所有的测试的样本的数量,OK大概就这么一个思路啊,那接下来几行大家自己完成啊,这个就跟我们任何机器学习,深度学习没什么关系了对吧,这几行的逻辑的代码。

给大家布置一个小小的啊作业,OK接下来就是我们的evaluation的过程,好大家看看有没有问题,我再拉一遍啊,大家看有没有问题,对总体来说其实很简单,就是把你整个流程串起来。

也就是说你有了训练的模型O,然后啊你有了测试的样本的数据,因为这个时候你有testing的query的贝塔啊,并且我们说了testing那个data的时候,它的query的名字它其实就蕴含了它的id好。

所以你其实这个已经有了,然后在你的GARRY的那个部分呢,它其实会有对应的啊,就是跟这个id相同的那个样本,但它肯定有嘛,不然你无法检测啊,检索出来你其实就是希望什么呢。

通过检索SENIARITY相似度比对,然后把你在GARY的那个图片跟你做testing data,做query的时候,同样一个id的那个图像把它的相似度很大,把它给检索出来,对不对。

这个其实就是你本来预期啊,预期的这样一个目标嘛,所以你自然而然会有啊,所以就在他给的这个材料就是数据里面呢,你是可以这样去做解析的,OK没有问题啊,然后就是啊有了模型,然后载进来啊,载进来的时候。

你其实就要注意到底你是用这个内置的模型呢,还是用了那个呃这个自己个性化定义啊,定义的那个模型,我们前面说了该怎么处理,在进来了之后就比较简单了。

其实就是啊你用那两个prediction阶段的generator,然后去读你的数据,然后得到那个dance feature,但这个dance feature你可能需要啊建立一个啊,就是输入式image。

然后输出是feature的这么一个model,然后这样就可以读出来了,然后就得到了两组feature,一组呢是你query的feature,一组是你carry的feature。

然后这两做feature去做相似度的比对,所谓的比对就把这两个向量啊,这两个呃这两组feature,然后做一次啊,矩阵的乘法,你就得到了一个similarity的这样一个matrix。

那这个matrix自然而然你希望什么呢,你肯定是希望什么呢,肯定是希望那个真实的就是那个id啊,他的similarity最大嘛啊,所以就是你这样按照你的distance倒排啊,这个一下从这个排序一下。

从小到大或者similarity从大到小来,这么按行的这么一个维度排序,然后取最大的那个similarity作为你的预测的id,然后呢你就要去拿这个id跟什么呢。

跟刚才你从query的那个name解析出来的那个id,你做一下比对,如果是一样的,OK那说明你对了,看理解这个意思了吧,嗯再给大家半分钟的时间理解一下,如果没有同学提出异议问题的话,我们就讲下去,好啊。

那看起来大家对evaluation,这个阶段没有啥太大的问题,那我们就走下去啊,走下去嗯,那接下来呢就是我们整个流程都已经串完了,对吧,那啊,其实我们的一个这个模型就已经完整地做完了。

那我们在想有什么样的方法能够去做一些,improvement呢,就可以去提升我们整个模型的这个方法,那今天我们要给大家介绍一个叫做啊triplet loss,一个东西,这个true loss呢。

也有时候有时候人们把它叫做deep brain,对就是深度排序啊,那这一些技术就是TRIBULOSS也好,deep franking也好,你从他的名字ranking,也可以知道它是用来解决什么呢。

啊他需要解决啊image retrial的问题啊,那举个例子,大家今天就要用到的淘宝上的拍立淘啊,好就是这个拍立淘的这样一个想法呢,就是你在你的淘宝的那个手淘主页上。

是不是其实就是啊有一个那个search by一个框框,把那个框框里面你拍一张图,好,街上拍一张图,然后他就返回给你,识别的这样一个结果对吧,这个就是拍立淘的这么一个啊,典型的一个应用啊。

所以就是跟图像检索相关的这个技术呢,TRIBLOSS会用的非常的多好,那这个chocolate是什么意思呢,triplet在我们英文里面啊,其实是三元的啊,这么意思啊,三元组啊,三元组,那,哪三元组呢。

在我们的这个啊算法里面呢,我们把这三个对象啊,这三元组的对象我们把它称之为这三个东西,比如说anchor,然后positive和negative啊,注意它们是相对的关系啊,就是啊。

我们这里的anchor,并不是指的是目标检测里面的那个anchor啊,不是那个anchor box啊,啊跟那个没关系,大家千万不要搞混了,我们这里指的anchor啊,是指的是我们选取的一个啊。

相对的一个参照物啊,然后这个positive呢跟这个参照物呢是啊,正样本的关系啊,然后positive呢,an negative呢跟它是负样本的关系啊,换句话说我们啊更加的啊通俗易懂的话呢。

其实就是啊我的positive和anchor,我要在某种程度上去share,一定的正相关的语义的关联度,而negative呢是具有反负面的这样一个相关度啊,是这么一个意思,我举个例子啊。

比如说我现在有一张狗的图像啊,那么狗的这张图像呢,嗯比如说是一个金毛对吧,金毛那positive呢是什么呢,positive呢其实就是嗯,比如说我可能也是一个狗的图片,比如说是一个边牧或者是一个柴犬。

然后negative呢就显然它不是一个狗的图片,比如说他是一个,好猪的图片或者羊的图片啊,或者呢是一个汽车的图片,或者是一个什么呢,这个飞机的图片,就总而言之它不是狗的图片。

所以它是一个negative啊,所以就是啊大概它的这样一个意含义就在这,就是positive是跟我的anchor share一定程度上的啊,有语义的关联度的这样一个东西啊。

negative呢是有负向的这个啊关联度好,那我们的目标是什么呢,啊就是我们的target或者loss函数是什么呢,啊,啊他给的目标啊是什么呢,是希望什么呢,在我们的特征空间里面啊。

在我们要去学习的这样一个特征空间里面,positive和anchor之间的距离,要小于,negative和anchor的距离啊,这里我们稍微停一下,大家可能要消化一下,大家能明白这个含义吗。

注意我们说这是我的目标预期,就我希望是这样啊,就是我的lost的函数的形式,我们要把它设置成这样的目标啊,就这是我们的优化的目标,就是我们positive和enter之间的距离。

要小于negative和ANK之间距离,大家想想看,有道理吗,你现在的要做的事情是什么呢,就我们在做raid这件事情对吧,那REID这件事情是不是,其实我们本质上是一个图像检索的子任务。

它其实也是这么一个问题,所以我希望什么呢,在我选出来的anchor和positive,还有negative,那么在我的语义空间space上,也就是我的那个dance feature的那个特征的维度上。

我可以满足这样的条件,那这样的话其实就说明什么呢,说明我的这个embedding的这样一个space,就fish space是训练的足够好的,大家想想看能不能接受这样一个说法啊,也把它扩展到什么呢。

扩展到这个呃image retrial的这样一个领域,好如果大家能够听明白这样一个点呢,那我需要再加一个变化啊,大家想想看啊,在你们学SBM的那个损失函数的时候,我们有做一些什么样的变化吗。

其实我们当时是说哦,我们要去learn那么一个margin对吧,认那么一个margin啊,论那么一个决策边界,那事实上我们是不是需要什么呢,我们是不是为了使这个决策边界,是有一定的鲁棒性。

我是不是需要让我们的那个support vector的那个margin,我们需要让它拉的足够开,大家回忆一下是不是这样的一个预期,大家回忆一下你们在学SBM的时候,我们是不是有一个正负样本的分类。

然后support vector,然后我希望什么呢,我希望那个margin是足够的,鲁棒的,对不对,就是那个角色边界,所以我要看正负样本是有一定的margin存在对吧,不然的话。

如果我的正负样本都在那个角色边界附近好了,那完了,那稍微动一动,那我的决策边界就挂了对吧,所以呢在我们现在的这个约束条件里面,也是一样,我也会加一个约束条件,大家想想看怎么加,这是我希望。

positive和ANK的距离,其实要远小于anchor和negative呃,anchor和negative之间的距离,对不对,但是这个远小于它不是一个量化的一个约束呀,它只是我们国人。

或者说我们的人类的一种描述的语言对吧,远小于那什么叫远小于嘛,你给我定义一下什么叫远小于,在数学上远小于指的是什么呢,指的是不是我可能会加一个margin啊。

然后这个margin呢比如说一啊或者二或者三,或者0。1或者0。20。3对吧,然后呢他小于我们的另外一个是吧,如果加上了它,我都还小于你,那说明嗯我足够小了,这个大家能理解吗,这个能理解吗。

好这个如果能理解的话,那就很好了,就是你基本上就已经摸透了啊,tribute loss的这样一个精髓啊,精华所在好,但是在这里举的这个例子呢,我需要把它再往深了去,让大家去啊思考啊,什么意思呢。

我们前面是说啊,我们举的这个例子是说哦,假设你有一个边牧啊,有一个鞭毛,哎呦sorry,有一个金毛,然后你有一个边牧对吧,是你的positive,然后你的negative样本是一辆汽车对吧。

比如说奥迪好,大家想想看,我们这么去取我们的positive,negative和anchor,有没有太大的意义,有没有太大意义,那首先呢就是,我们想想,刚才我们举的这三样物体。

是不是其实本身我的区分度就会比较高对吧,就是我的positive和我的negative区分度比较高,我的猫和狗哦,我的猫和那个汽车,也就是说我本身通过一个常规的分类的,损失函数训练。

得到一个CN的一个feature space,可能这个fish space就已经满足这样的条件了,大家承认吗,认不认可这件事情,很合理啊对吧,我要做分类啊,我们说了。

我们在train这么一个CNN的时候,我顺便就会得到那个feature space,那我做一个KN的话,可能我就已经能够搞定这件事情了对吧,如果我用TIFFANY啊。

任何一种降维或者PCA的这样一个手段,去画我的那个啊embedding space,去投影在二维空间上的一个平面图,那可能我就已经满足了,刚才我们想要达到那个效果对吧,就是我们的dog可能聚在一起。

然后啊car这一类也聚在一起,这两个其实是拉的比较开的好,但是今天我换一个任务,假设我让你做细粒度图像分类,翻grade image classification,那想想怎么办。

好所谓的细粒度图图像分类分类,其实就是指的是,当class和class之间的相似度没有那么高,比较有模糊的时候,比如说植物动物这种生物特性的这个分类,对吧啊,有些同学也搞不清楚什么是水芹,什么是芹菜。

对吧啊,什么是香菜,对不对啊,也有可能搞不清楚啊啊,所以这个就是啊问题的所在,所以当你要区分出狗里面的边牧金毛,德国牧羊犬哈士奇对吧,这些的时候,那可能我们刚才采取的那种sample就不够了,对不对。

所以针对这样的一种问题的处理,你要去让你的损失函数的优化,其实就是说哦,金毛和金毛之间的这个啊距离,要来得比金毛和哈士奇要来的高,R1要来的更小,对不对,然后同一个品种的之间的距离需要来的更小。

所以这个时候你的额优化的这个空间啊,目标其实就会采样什么呢,比如说你养了一个哈士奇,我养了一个哈士奇,那我们两个把图像给,啊分别做anchor和positive,然后在另外一个选一个嘛,金毛对吧。

这样的话我才能够去啊,合理的希望我的结果会更好,所以刚才说怎么选取啊,我们的anchor positive是很重要的,所以呢,选取这件事情其实就是采样,Anchor,Positive negative。

是非常重要的,对不对,是非常重要的,就如何去sampling我们的这样一组data,好,那如果我们把我们的视线拉回到我们的person,REID这样一个领域里面,你们认为,如何去采用我们的数据呢。

大家想想看,如果在我们的person reid这样一个领域里面,我们怎么去sample我们的data,大家有没有思路,如何去选,最好的方式呢,我觉得anchor。

和positive可能没有什么太大的问题,最好的方式呢就是anchor,anchor和positive是同样的,ID的,这个就没有疑问,对不对,而negative呢是不同的id。

这个就叫做present raid里面的something,这个很合理吧,很合理啊,啊我跟自己的这个图像比,要比其他的是接近的嘛,如果你能听明白这一点的话,啊如果你能听明白这一点的话。

那么你就能够想想看,我怎么能够让我的模型啊,让我的这个采样变得更加的什么呢,有难度,因为你现在应该能够预期到,其实模型啊他怎么去学,完全是取决于你喂给他什么样的数据的样本,对吧,当然这个样本是要合理的。

是可收敛的对吧,你不能让它喂给你,不能啊,让他喂给他一些错误的一些这个样本,他的就得不到合理的结果吗,那么是不是有一种这个大家的这样一个想法,就是我让他喂给他,越有难度,区分度的一些数据。

他可能会学的更加的什么呢,特征学的更加好诶,如果你是这么想的话,我觉得是有点开窍了啊,是合理的一个推测,当然了,你可能要考虑到就是你不能一上来就给喂给它,很难的这样一个样本。

就好比我们的自己来学我们的知识啊,我们也是循序渐进的对吧,小学初中高中大学一上来,你小学让你直接去学微积分,你懂吗,你肯定也不懂嘛,所以一样的这个含义,所以这个你要去把握这样一个比例。

所以呢有一种叫做这个,Hard triply dogs,啊这个是什么意思呢,这个其实就是说我要选一些困难的一些样本啊,啊我们要去选取一些困难的训练的样本啊,让我们的模型来train,比如说啊举个例子啊。

本来在上面我们其实选了一个,比如说hard negative在上面,是不是我们随机选了一个不同的id,作为我的negative,而事实上呢事实上呢我们是不是可以去选,我容易错分的那个贝塔。

最我的negative,我这么说是不是能够理解,就是对于我的training而言,我选择那些容易区分错误的data作为我的negative,是很合理的,为什么这么说呢,因为大家在读书的时候。

老师都会让你准备一本,错误的习题集的顶正本,对不对,考前多去看看容易犯过的错误啊,其实也是这样一个道理,那么怎么来做这件事情呢,嗯那我举一个例子呢,可能大家是能够很好的理解了。

就是说假设你今天穿了一件蓝颜色的夹克衫,然后呢蓝颜色的牛仔裤,浅蓝色牛仔裤,你说我们的模型是更容易错判那些,比如说穿穿这个碎花裙子的美女,还是说诶我有一个蓝领的工人啊,不是不一定是蓝领的工人吧。

就是我们的一些啊,这个就是换句话说其实就是防疫工作人员对吧,我可能会穿这个蓝颜色的这个这个大褂啊,就是我们的这个防护服啊,你们说哪两个是容易去错分的呀,那是不是后者容易错分,因为都是蓝色的嘛对吧。

然后这个夏威夷碎花裙子那么鲜艳,跟这个蓝色完全不一样的,你当然不容易区分错了,所以此时此刻,你们觉得哪个是我们的hard negative的sample,是不是去采样我们的防疫服的这样一个人的。

这样一个id的图像,去作为你的hard的negative sample要远远比什么呢,比碎花裙子来的更有价值对吧,很有可能在你的cn baseline的那样一个,分类的损失函数里面,你通过。

分类的这样一个好soft max的损失函数,其实你就已经能够区分做区分了,你还根本都不用去其他的,对不对,大家能明白我的这样一个含义吧,好如果能明白这件事情的话,那就好办了啊,那就好办了。

那我们来尝试啊,就是来定义一下这个jb loss,我们说我们的这个写任何一个损失函数,它的参数呢很固定啊,Y true y predict,还有我们的那个margin对吧。

比如说我们这个margin就叫阿尔法,比如说我们阿尔法就用0。3啊,好然后这里我们做一个说明啊,所以这里的y predict是什么呢,while predict其实就是啊在我们做这个呃。

因为我们会有这个anchor positive connective,未进来嘛,三步进来,所以我就会得到这三张图像的embedding,对我们假设这三张图像的embedding都是。

比如说2048维度的,我们就会把它给啊CONCAT在一起,就是啊把它这个stack在一起,就是啊这个2048,比如说乘以三啊,就是这么一个东西,所以这是我们的prediction。

然后我们会对它来进行解析啊,就是我们做这么一个小小的这么一个假设,所以它已经会变成我的prediction了,对不对啊,啊这个我们稍微要import一个东西啊。

然后我们会用这个l to normalize,我们先对这个embedding做一下规划,这个很合理,对不对,然后呢我们可以得到我的batch size啊,这样的话很简单吧。

我的白痴size其实就那玩意要除以三,因为我会有三倍的啊,这个这个anchor positivity,还有negative对吧,在这,然后具体而言呢我们会把这个ship as list一下。

然后呢我们会把这些东西去解析一下,就是anchor positive和negative,分别来进行解析,这样的话,我就把这三个东西分别从can cat的这个呃,状态里面,我把它解析出来了。

然后还记得我们刚才说了,我们要去算那个positive,distance和negative之间distance对吧,所以我们要去算一个什么呢,对吧,然后我们还需要算一个,是不是要算这俩玩意。

那其实就是K,对吧,这样我就把它distance啊给算出来了,然后我们还要用那个阿尔法那个东西,对吧啊,这也很简单,其实你的loss就是什么呢,大家想想还是什么,你的loss肯定不会小于零,对不对。

因为我们的loss啊,所以你其实可以用那个我们说之前这个margin,这样这种函数损失函数,在我们讲那个折页损失,hinge loss里面是不是讲过了啊,是不是我们用那个RO那个函数。

就可以把它实现了啊,RO那个函数大家还记得吧,其实就是,零对吧这么一个玩意儿,这样我们就把TRIPLOSE给实现了,大家来看一看,有没有什么问题,大家看看有没有什么问题,two bloss的实现。

好那如果这块没问题的话,我们就往下面走了啊,就是,那我们接下来就要来谈怎么应用对吧,怎么应用,好我们在这边啊,training的这个里面来来改,切那就像我们的snl model,好在这吧。

那global pool已经有了,然后因为我们要使用这loss嘛,我们可以先假设我们在这里,要不我们就直接干脆做一个这个normalize,得了啊,尽管后面去block可能我们也会做。

但是我们可以为了保险起见,我们也可以做一个,然后这里做normalize,在雷欧里面做呢,我们可以用类似于呃,这个Python里面的lambda表达式来做这件事情,啊栏目的layer。

然后一样拉姆达的表达式,好那这里还有一个小技巧,就是如果你想为了后面再model点summary,看得清楚一点,那你这里也可以给它定义一个名字,比如说你的name叫TRILATE,啊也OK的啊啊啊。

这里K我们需要import一下,啊就OK了,然后这个dance呢呃我们依然可以这样去加啊,小狗,然后source max output没问题对吧,然后对于model而言。

我们是不是这里可以选一个triply model,那CN点value input好,这个时候我们给大家介绍一个新的一个想法,就是之前我们其实都是单分支的对吧,一张图像进来,然后一个分支输出。

那其实我们的神经网络也可以多分支的输出,多分支的输出,这种东西呢也称之为叫multitask learning,就是多任务的一个学习的方式,这个多任务的学习方式的这个想法,其实就是利用什么呢。

就是利用这个啊,多个任务和多个loss函数的约束的条件,使得我的模型的优化呢是来的更加的好啊,比如说呃在我们这里,一方面我们通过损失函数的优化,另外一方面我们通啊,通过这个啊两个损失函数的优化。

一个是我们的COSENTI比损失函数,一方面是我们的TRILOSS损失函数,所以这样的话我其实就可以,啊给这俩玩意就是一方面是输出啊,给那个tribe loss。

还有一方面是输出给我们的soft max ok啊,所以是这两个东西可以输出啊,这我们可以改一下,好,那我们休息10分钟,然后我们继续啊,好嗯,那我们接下来就进入到我们的loss函数的,这个阶段。

好那在这里呢我给大家这个更新一个点啊,就是啊有同学可能会觉得哎,老师你自己写一个去BLOS麻烦吗,就好像你自己写co30ING麻烦吗,啊我有没有一些可以调用的一些简单的一些啊。

API能够帮我们去cover这个事啊,OK那我们说是有的啊,就是你可以这样去cover啊,首先你要pip install一下这个东西,啊好,然后呢,那这里面有一个TRILOSE。

OK我们就可以import这样一个tribute tr,这样一个loss,然后我们就可以改一下tribute model啊,你要compile这个东西好,那关键的就来了啊,关键就来了。

你有几个分支的输出,其实就对应有几个任务,这个很好理解吧,啊有几个分支的输出就对应有几个任务,我相信就不用啊,没有什么疑问的,那有几个任务其实就应该对应几个损失函数,唉这个大家OK吧。

啊我不觉得可能这个有太大的问题啊,有几个任务,你就应该有几个对应的损失函数对吧,你你损失函数是用来去引导和约束任务的吗,所以这个时候看到没有,前面我们写的分支的输出是有几个两个呀。

一个是trip loss,一个是什么呢,soft max的output对吧,那在我们这个loss这里呢,在我们这个loss这里呢,是不是也应该有两个损失函数来去约束它呀,所以肯定是这个样子的,对不对。

所以肯定是要对应什么呢,你的那个loss对吧,所以前面他tribe lose放在前面,那OK那你的tribe lost,这应该放在前面,是吧,你就应该这样写,下面一个也是一样。

这应该放在前面应该是很合理的吧,好这样的话呢你就把tribe loss就应用一下,当然前面你要改一下这几个model对吧,放回这里,好来大家看看有没有问题好,那如果这块没有问题的话啊。

就需要大家思考一个问题,我们现在模型能够乱通吗,能转起来吗,注意我提的这个问题啊,我问的是大家这个我们模型能不能乱通,能run的起来,我们说是不能run起来的,为什么呢。

看这里这里的generator用的是哪里的generator,是不是用这里的generator,这generator generate是什么,是什么,是不是x batch和y batch。

而y batch呢又是一个one hoencoding好了,可是我现在的损失函数或者我的输出是两个呀,所以如果你不改你的generator,你一定在这里会报错,对不对,这个是不是很合理的推测。

这个分析能听明白吧,所以这个真的rate我们要改啊,我们要改啊,只有改完了之后,我们前面那个模型才能乱起来,才能跑通,不然你肯定跑不通的啊,你想想看是不是这个道理好。

我们把它复制100,然后我们尝试来改一改。

好我们把它假设叫这个啊,triplet好了啊,然后这里有我们可能会稍微做一些小小的变动,对于输入的这个啊采样的这个形式,前面不变啊,然后这个batch size呢我们稍微对它进行一些改动。

我们定义两个东西,一个是P,一个是K好,我们来解释一下,这个P呢其实就代表person id的个数,然后这个K呢就是四啊,为什么我们这么定义,我们有原因的是,因为啊我们现在要做这个TRIPLETE。

hard的这样一个mining,所以我要知道哪些的就是同样的一个呃id,我需要保证有一有一定的这个量的图片,不然我怎么去做positive connective的sampling,对不对,所以很合理。

也就是说我会随机采16个,也就这里的P个人,然后每个人呢我随机在采K张图像啊,所以我的h size其实就P乘以K啊,这个能理解吧,这很合理吧,很合理啊,很合理,那这个时候呢大家想想看啊。

我是不是很想知道,就是给定的一个这个person id,我是不是很快的可以去找到它对应的这个额,有多少张图像,所以我要建立一个字典对吧,而这个字典的建立呢,其实啊就是我们的一个哈希表嘛。

就是我们的那个Python里面的一个字典,我就可以去建这样的一个key和value,的一个这么一个东西,好,所以我很快我就能够额这个建这么一个哈,希表啊,比如说,好我们会用一个这个这么一个函数啊。

帮助我们快速来建立这个函数的意思,其实就是啊如果这个key在这个里面呢,我们就把它的value取出来,如果没有在呢,我会给它复制一个新的一个key,然后它对应的value呢。

就是我们的一个啊空的一个list,这很合理对吧,然后不管怎么样,我就把它append嘛,就把不断的image pass把它判断到这里面,这样的话给任任意一个呃,这个id我就能知道它的对应的那些。

好对应的那些那些,就image the pass,好,啊这里我们做一个小小的约束啊,就是,那想想看是不是所有的id我其实我都能用呢,其实不是对吧啊,我其实要大于等于我们的K1张图像好,我可能才会能用。

好我要true,来我们先踩P个人对吧,这个很合理,对不对,然后呢我从这个踩的这个人里面,我是不是,要去踩没,我是不是要去踩他的呃,这个image pass对吧,这也合理吧,这个我们前面说过了啊。

我们要这么改,然后啊这个时候呢我们其实就啊需要什么呢,呃它们对应的这个,person的ID,就是他其实是有一定的重复的对吧,因为我们说我采样了K个人过来,然后他采样它对应的这个。

就相当于我要去建立一个list,这个list跟我们的image,pass sample的这样一个维度是一样的,就大家能够明白吗,因为这样的话我就能够得到什么呢,得到啊得到我的label啊。

这个label呢是为了后面我们可以去做那个啊,这个数据的迭代,就是我去做我的啊YEL的啊也好,或者这个输出也好,我我很方便的,所以是这么一个啊想法。

原因为呢我在image pass sample的这样一个情况里面,我其实是list里面还有list,但是我其实要什么呢,其实我要把这个list给flatten出来。

就是所有的我不能在这个里面还有list,对不对,因为哦我要拉长到一起啊,所以为了做这件事情,我要把它flatten起来,我其实就干的这个,现在这几行代码是有点偏这个工程啊。

如果大家如果现在一下子反应不过来,就去命令行里敲敲,你就大概知道他在干什么了,因为我所有的id都一样的嘛,所以我就可以乘用这个来乘,啊一样,啊依旧,这里小Y和大Y其实就是差在。

是不是往后ding encoding对吧,哦来换一行。

好那这样的话我们就写完了,我们这个list啊,注意这个小y batch为什么是用小Y,而不是用大Y呢,是因为这两个东西,这两玩意大家想想要对应什么,是不是要对应这俩玩意儿,213行的。

是不是要对应我们刚才写的这个loss啊,是不是要对应这个loss,就这两个,大家想想看,就是你的data的generator的这么一个输出,是要对应什么呢,你要是要对应我们的啊,lost这两个的定义。

这两个要定义什么呢,又要对应什么呢,model的输出对吧,这三个东西是要一一去对应好的,不知道大家能不能消化,好我再帮大家理一下思路啊,就为什么我们要修改这个generator啊,才能够乱通。

是因为首先我们动了模型的结构啊,我们说我们要把我们的trip loss来进行,融合进来啊,所以就是我们使用的方式是multi task learning的方式,就多任务学习方式啊,多任务学方学习方式。

其实就是我们用了两个分支输出啊,我们有两个分支输出,我们用了两个分支的输出,又对应什么呢,两个分支的输出,又对应了我们的loss函数来进行修改,要跟它来进行对应对吧,然后此时这个又对应什么呢。

又对应我们后面要应用这个loss的话,我们要去做FX对吧,就是model点fit,那如果我们的模型没有啊,就是我们的generator data没有跟前两个来进行对应,上头显然我会报错对吧。

所以我要去动物的模型啊,动物的generator啊,就是改改成这三个是一一来进行对应适配的,它才可能是能够通过,那不然一定会报错报错,大家对这个有没有问题啊,想想看,好如果是这样的话。

就大家把刚才这个generate这个batch呢,就可以改成刚才我们的,这个,啊这里的batch size就改成那个P,就好了,好,看看看有没有问题,好如果大家对这个没问题的话呢。

我们最后一点时间我给大家介绍一个呃,learning weight的一个修改的一个策略的一个方法啊,然后这个方法呢主要也是用在我们的call backs,就是回调函数里面可以去进行参照的啊。

好我们来定义一下,就是因为我们在learning rate的时候,通常来说来现在我们大家都是手动来进行下降,比如说我调一半对吧,或者调啊1/3啊,那假设我们可以这样去调的。

假设我们的learning rate在一共要训100轮对吧,可能获得120轮,然后在第40或者第70的时候,我们让他去乘上0。1的系数,这样我们就不用手动去动了,然后我们的这个回调函数大概长这样。

OK然后在最后我们的model checkpoint这里面,我们可以同时import一个叫做learning rate schedule,这么一个东西,好除了我们初始化一个checkpoint。

我们还可以,然后在这个checkpoint这个里面呢,后面我们可以跟一个,好这样我们就完成了checkpoint的后面的,啊回调函数更新好,大家对今天的内容还有问题吗,好希望大家还是能够在课后的时间。

能够自己去手敲一下我们课上讲的这些啊,cod和这个想法,然后会离得更加顺,然后帮助大家更好的去更快速的去理解,啊尤其是今天我们讲过的啊,为什么要改那个generator啊,这么一个逻辑关系啊。

这样你能理解的话,你就对整个通盘的这个理解,就会更加的通透了啊,就不不会只是说哦老师说要改就改啊,然后你预期不改会报什么样的错,这些都一切尽在你的掌握之中,那就是你来控制code。

而不是code来控制你,好如果没有其他问题的话,我们今天的内容就先到这里,然后后面的安排就请听孙老师的安排好吗。

1447-七月在线-机器学习集训营15期 - P9:04-基于SQL的机器学习流程和实践 - 程序员技术手札 - BV1ASste6EuZ

嗯哦行行好,那我们就稍等一会,那就开始,大家之前学习过circle吗,有学习过,有之前已经学习过,有基础对circle有基础的同学吗,有没有同学,我看群里面已经有有同学在问circle的。

其实嗯如果大家之前对SQL有一定基础的,可能这节课会稍微好一点,学过啊,哦那好看来还是有同学学过的,大家对我们之前的课程有问题吗,或者说有什么问题吗,我们就是我们每次留给大家一个实训的一个。

这就是说作业并不是特别难,主要是考虑到有些同学他的基础啊不太好对,如果大家觉得实训太简单了,也可以在群里面艾特我,然后我也会给一些更加深入的一些资料,给到大家,那么有没有同学之前学过spark的。

或者说学过大数据相关的,应该是有应该有同学学过,嗯好我们再看我们再等12分钟,因为还有同学没进来,只知道大数据的概念好,那么我们今天就给大家介绍一下啊,这这些特别是spark的。

那么我们就开始我们今天的内容啊,我们今天的内容呢是基于SQL的一个,机器学习流程,那么我们在之前的课程呢,其实都是讲解Python环境下的一个机器学习流程,但是呢其实circle也是非常重要的概念。

非常重要的概念啊,就是说其实也是呃很重要的,那么我们今天的一个课程内容呢,其实偏向于具体的一些案例和工具的一个语法。

语法讲解,我们呢今天的一个就是说课表是课程呢,就是第一个是circle的一个基础和大数据开发,我们在会在这部分的讲解,SQL的一个基础和大数据开发这个岗位嗯。

第二部分呢我们会讲解spark的一个介绍和使用啊,第三部分呢我们会讲解spark socl的使用案例,第四部分呢我们会看这个spark的机器学习的案例,好的,那么我们就开始我们今天的一个内容啊。

首先呢是第一部分我们的一个SQL与大数据开发,那么SQL呢可能之前大家已经学习过一点,我们就简单介绍一下SQL呢,它是用于访问我们数据库的标准的计算机语言,它能够完成我们的数据插入查询更新和删除。

而且能够完成所有的跟数据库相关的控制,那么呢我们现在的一些常见的一些数据库软件,比如说MYSQL这个server或者说oracle,他们的一个交互呢都是说是SQL语言的,所以说大家在学习数据库的时候呢。

其实也是就是说学习这个SQL的语法,那么SQL呢有同学在群里问了,说是不是我们这个消防工程知识,或者说是不是大家需要掌握的,其实是这样的,SQL呢是其实可以视为一个额,就是说计算机的一个基础。

因为数据库也是,基本上所有的计算机专业的同学呢都会学,所以说呢也是需要大家掌握的,也是我们大数据开发的一个必备的技能,那么这个图呢就画的是我们的所有的编程语言,其实呢它的一个交互呢。

都是通过一个circle的一个语言对吧,我们这个A在这个地方的HTTP,通过我们的HTP发送我们的具体SQL语言,跟我们的啊,再通过我们的circle的一个软件,再跟我们具体的一个数据库进行交互。

那么这个呢就是说我们其实每一种,我其实说这个circle的一个语言呢,它其实是独立于所有的编程语言,它其实是跟数据库强强相关的啊,强相关的,那么这个地方呢就是说呃我们嗯还是建议大家。

如果之前没有学习过SQL的,是需要学一下,它是对所有数据库管理的一个语言,而且SQL并不是很难,就是说它是非常简单易懂,确实成本低的数据库呢,我们对吧,如果大家是转行的,我稍微介绍一下,数据库。

是用来查管理和查询数据的一个关系系统,那么常见的关系型数据库呢有MYSQL,Sex server,那么还有一些非关系型的数据库,那么数据库呢可以用来帮助我们,很简单的进行一个数据的一个插入修改查询。

而且呢数据库的一个存储结构是非常稳定的,能够保证我们的数据进行一个有效的存储,数据库呢它还是这种,它是多用户的啊,就是说我们那个用户的权限是隔离的,是可以支持并发操作的。

而且数据库是可以支持回滚和保持时间的,原则性啊,呃这个地方呢就是说我们呃,如果大家就是对数据库没有一一定的了解啊,可以稍微就是说记一下,就是说数据库其实我们它是现有的,有生活中我们一般的嗯这种订单啊。

密码用户密码,或者说嗯这种比较重要的一些信息啊,都是存在数据库里面的,那么我们有在前面的课程呢,其实已经讲解了pandas对吧,其实在或多或少用到了pandas,那么有同学说老师这个地方呢啊。

ANDAS和我们的circle其实是不是一样的,其实不不能说完全不同啊,他们其实是有很多相似之处,那我们pandas的一个本质操作呢,和circle的一个操作其实是相同的。

只是一有就是说有一个具体的一个实现,是就是说不同的,比如说我们的pandas as可以完成数据筛选,pandas as可以完成数据展示,pandas as可以做一个数据删除。

那么pandas也可以做数据的分组聚合,分组统计也可以做多表聚合对吧,这也是我在我们的pandas里面都可以用的,那么circle能不能用这些呢,其实circle也可以完成这么多对吧。

额那么有同学说SQL只知道增删改查,不知道实际工作中怎么用的啊,我举一个例子,就是大家嗯就是说嗯举一个很简单的例子啊,就是说电商电商,你就是说最开始我们在登录这个账号的时候,他会做一个校验对吧。

我们的用户名和这个密码进行校验对吧,一般情况下呢就是说这些公司呢,他会把这个用户名对吧,相当于是大家登登录的账号和具体的密码,密码可能是加密后之后的啊,把它存在数据库里面,然后呢通过这个数据库对吧。

我们能查询出来这个用户的一个用户名和密码,是不是匹配的对吧,这就是说是根据查询来找到,就是说具体具体的逻辑,那么在电商里面还可以这样做,就是说我们统计这个用户,他这一个月来或者这一年来。

这个所有的订单的一个总金额,就开销总金额对吧,大家的支付宝账单对吧,呃年度支付宝账单,年度京东账单对吧,其实他也是用到数据库的,就是说select,就是说查询我们2020年的这一年度的。

所有的订单的一个消费的金额对吧,所以说呢呃circle,如果大家只知道这个具体的一个增删改查,其实只知道就是说基本上知道这个语法,但是呢其实在我们的实际过程,实际业务中呢。

其实就是说它存在一个从业务的一个逻辑,到我们实际数据查询的逻辑的一个落差,这是有一个落差的啊,那么我们其实作为一个程序员对吧,程序员其实嗯有人说他是一个circle boy。

circle boy就是天天写circle的人,那么circle boy,就是说,我们其实很多时候都是在做数据的一个查询,那么这个查询就是说我们要理解程序员,理解理解这个产品经理的需求。

然后把这个具体查查询的逻辑呢,用SQL的语法来完成,就说实现出来,那么我们首先来看一看pandas,as和这个SQL的一个语法的区别,那么右边这个啊在SQL里面呢,这个它的一个具体的就说。

我们用用逗号来分隔我们的列来进行选择,比如说我们用心呢表示的是选择我们所有的脸,那我们来看这个语法啊,Snack total beer tips,Tip smoker time。

这是呢四列我们选择的四列,然后呢from tips,这是我们的表明表明,然后limit5,就是说我们只要就是说从这个tips表格里面,选择这四列,然后只选,就是说只展示前面五行好。

这是circle的一个写法,那么在pandas里面是怎么样的,pandas就是说tips选择我们这个四点啊,它是用于我们的一个索引的方法,索引出来之后呢,然后head5他是这样的啊,他是这样的。

那么这样呢,就是说其实pandas本质和circle实现是差不多的,本质就是说实现跟SQL实现差不多的,而且这些语法上其实都是很相似的,那么我们再来看一看,其实有同学说老师我为什么要学习SQL。

其实是这样的,Circle,第一个是这个基础的一个技能,第二个呢其实在很多的一些面试里面,非就是经常会会被问到啊,就是面试题,不管是当面试题还是当一个技能,很很可能会问到,而且呢我们的大公司。

一般的这种就是说互联网的一些公司呢,他们招的算法工程师,并不是说纯的Python环境下的,他很有可能就是说是一个具体的一个呃,就是说就是大数据平台下面,这个是很正常的,据我了解就是说叫阿里。

阿里基本上就是说他们的开发,基本上都是写circle的,没有没没有环境给你写Python,没有环境给你写牌子,就是说在大公司里面,单机的开发其实是很少的,就单机可能就只是用用来训练很小的模型,很小很小。

一般情况下,就是要不就是在我们的一些大数据平台上,写SQL的语法,然后再做一个具体部署,所以说大家去找一些上网工程师的岗位啊,你去看这些招聘简历,其实很多都是要求这个大数据开发。

不管是spark flink等等相关的一些大数据工具啊,这是很现实的,那么大数据开发呢,我这个地方列举的就是它有三类岗位啊,第一个是大数据开发的一个平台和管理,这个呢主要是数据仓库的工程师。

比如说数据运维储藏工程师,那么第二个呢就是大数据平台的一个数据分析,挖掘,机器学习等相关技能,这个呢可能是大家比较感兴趣或者想应聘的,就是说是这个数据开发工程师,那么这个呢其实也是在大公司里面。

又可以称为叫做算法工程师,第三个呢就是大数据分析的一个结果及展示啊,这个呢主要是一个数据分析式的,那么我们还是希望大家能够关注一下,第二个技能,第二个方向啊,就是大数据平台下面的一个。

机器学习和数据应用的技能对,那么其实呢就是说大大部分的大公司啊,特别是BAT级别的大公司,或者说呃就是拥有海量数据的一个大公司,其实他们的一个上网工程师,也是数据开发工程师。

那么circle的技能和spark的技能也是需要掌握的,那么就是说大基本上大数据开发,它的一个整体的一个薪资也是偏高的啊,比这个软开是高一些的。

那么在我们进行具体讲解spark之前呢,我们首首先带着大家稍微稍微熟悉一下,我们的一个circle的一个和PENAS的一个。

具体的一个对比,那么我们来看一看啊,circle呢,其实我非常建议大家,基本上花一天的时间就可以把它完整的学习完,就是SQL它用到的一些语语法基本上很简单啊,基本上很简单。

就是说基基本上就是一些简单的名词,简单的名词呃,就是说大家可以按根据这个教程,基本上刷一遍就行了,刷一遍你就可以把大致能记住啊。

基本上一天就能刷一遍,一天一天就能刷一遍,那么我们就看一看circle。

它和pandas as对吧,pandas as大家都熟悉,那么我们看一看circle和pandas as,它具体的一个对比对吧好,那么额我们如果把这个数据集对吧,这是这个就是说我们方块。

这个是在IPYTHON环境下的,那么我们看一看这个pi Python环境下的一个数据集,其实它读取完成这个pandas之后,就是个data frame对吧,那么我们再来看一看呢,具体的对比。

其实我们刚才也对比了对吧,这是select,这是circle select,这是pandas的一个数据选择,circle的一个语法,就是说我从里面选择什么列,从,然后具体的表格是什么。

然后最终那个显示的一个结果是什么,这是很简单的,就是说select from limit,然后呢如果我们想加逻辑筛选,其实也是可以加的,在SQL里面都是可以加的,select新新式表示我们筛选所有的列。

From tips,where time等于dealer,就是说我们从这个tips表格里面筛选得到time,等于dinner的行,然后呢我们只选择前面五行,那么在pandas里面是这样写的。

这个是我们的一个逻辑对吧,这是我们的筛选逻辑,然后这个tips是我们表格,然后进行索引,然后head5大家可以看到就是说这个circle,它这个这个最终的一个展示,其实它也是在最后来进行的。

就是说limit最终进最后进行的对,那么a circle呢它这个语法也可以完成多个啊,就是说逻辑的操作,比如说time等于jinner and tip等于大于五,就是说我用两列来完成筛选。

一个time等于deer n n的T不大于五,这是两列来进行逻辑筛选,好我们往下翻,那么哦circle呢,其实也是可以支持数据的一个什么空值查询的,这也是可以的,这也是可以的。

那么SQL也可以做一个分组聚合,那么这个地方是需要注意的,就是说而我们的一个分组聚合,其实grop by对吧,那么它的一个操作逻辑,其实就是说把我们的数据集进行分组。

然后八就是说统计每个组里面的一个平均值,或者说求和,那么在circle里面它也叫GRPB对吧,其实这个地方你看到,其实在circle里面的很多的一些单词,和我们在一个呃pandas里面。

用的这些单词都是一样的,只不过它就是一个具体的语法不一样,那么在这个地方其实它的一个就是说操作,但是他这个语法有点有点不一样,我们来看一看啊,我们对tips这个表,Grop by sex。

按照这个sex这一列来分组统计,分每个分组下面的一个大小好,他是这样写的,那么我们看一看circle select sex,逗号count新tips from tips group basics。

那么这个地方大家可能看着就有点迷糊,这个操作就是说这个到底是什么含义,我们其实在大家我们前前面这个地方,网上最最上面啊,嗯我们这个地方select新,就是表示的是我们选择所有的列出来对吧。

那么我们假如说想要选择我们想要的列,那么我们就就是说把这个想要的列名,把它写出来,那么在这个地方我们的group by对吧,那么这个地方是什么含义呢,第一列是我们的sex,就是我们的分组的取值。

第二个能力就是count型,count型就是说我们分组之后,它每个分组下面的一个取值的一个个数,是这样的啊,就是所以所以呢在这个地方,他的一个可额每列的一个,就是说计算得到的逻辑呢。

可能还跟我们的GRP外跟跟他有关系好,那么我们的一个呃就是说呃grp band呢,我们分组之后呢,还可以统计这些,具体的就说我们group by smoker,grp bad day这两列。

然后统计它这两列对吧,其实你可以看到如果把它们做grp ban,其实他就是当我们的一个音,在pandas里面加一个index对吧,通过这个index来进行一个分组聚合,那么就是写这是一个独立的。

就是它是一个独立的,然后后面的呢就是说是这个分组里面的,聚合的情况对,那么这就是说select,按照我们smoker和day这两这两列,对其他的值进行一个分组聚合做统计好。

那么呃呃就是说呃在circle里面呢,还可以做这种聚合,我们假如说用这个呃pandas做句号,那就是merge对吧,我把这个第一个表和第二个表,用这个key这一键用K这一列来做一个呃,就是说内内联聚合。

那么我们就是说在这个circle里面怎么写呢,Select 7from d f d f1,Inner join def2,然后on这个呢就是说设置,我们具体的就是说它的聚合的一个呃。

就是嗯它的一个就是列名它怎么相等的,这个地方呢,就是说我们相当于是嗯简写了,就相当于是DF1的额,第一个表格的key和第二个表格的key是相等的啊,既然是缩写的,那么当然我们也可以就是说做复杂的。

比如说我们到底是左边连接还是右边连接,还是呃就是说外连接,都是可以用这个SQL来进行实现的好,那么大家呃课后呢,可以把这个基本上你你可以把这个Python的一个。

pandas的语法和这个SQL的语法大致你对比一下,你就知道其实呃circle和pandas有很多,基本上pandas就是用这个一个函数来实现,circle的一个语句,那么呃有同学可能会问到老师。

这个circle和这个具体pandas它到底有什么啊,区别呢,或者说SQL它具体的一个场景它到底是什么呢,就是pandas啊,我们现在大家学习的这个pandas。

我们在切到PPT,其实说我们学习到的这个pandas呢。

其实大部分都是一个单机开发,那么circle呢它可能是涉及到了一个多机开发,就是说有可能是分布式的啊,我们的一些数据库呢它是支持分布式的,那么而且是支持支持这种远程连接的,也就是也就是说。

我们可以把一个circle的一个语句,就是我们数据库部部署在远端,然后我们在客户端查这个,用这个SQL语句去连接数据库,那么pandas其实对吧,我们其实它是默认不支持这些操作的。

而且SQL它是比较安全的,比较安全的好,那么我们就来开始我们的一个spark,那么首先呢需要注意的是啊,就是spark可能大家学习起来是有点困难的,spark我们首先给大家进行一个简单的介绍。

是spark它是大数据的一个,就是说啊,就是说现在比较流行的大数据的计算框架,斯spark呢它是我们的加州伯克利大学啊,伯克利是大家应该也知道,就是嗯美国呃,美国的一个非常出名的。

非常牛逼的一个计算机的学校,然后呢,他是嗯基于这个内存的一个并行计算框架,那么spark它的一个优点主要有以下几点啊,它的一个运行速度是非常快的,由于它是基于内存的啊,它的一个速度呢。

基本上是哈杜普的一个十倍以上,SPARKK呢它的一个易用性比较好,它支持的语言有SCALA,有java有Python有R就是说我们用多种语言都可以,就说调用spark这个引擎都是可以的。

而且spark它的一个生态比较完善,就是说它可以支持spark circle,spark streaming这种牛市的一个计算,也可以支持这种我们的spark的机器学习库ml lib。

或者说spark的一个graph x就是我们的呃,就是说图的一个机嗯,机器学习的库,这都是可以支持的,i e spark呢它可以支持,就是说数据来源有很多,我们可以从CSV里面读取。

也可以从我们的一个呃,呃就是说MYSQL或者说从have里面读取数据呃,这是非常非常方便的,那么如果大家之前没有学过18,可能稍微给大家解释一下,就说呃我们spark其实是这种第二代的一个。

就是说计算框架了,第三代应该是FLINK的呃,spark它的一个操作是把中间数据放在内存里面,效率会更高,那么spark它底层的一个实现呢,其实还是跟参考的好多部分参考好多好都不。

那么斯spark他的一个就是说,他怎么就是说他这里面就有可能会涉及,涉及到一些面试题,那么就是说spark和哈德夫的对比,那么斯spark它就是第一个,它的一个计算呢是把中间数据放在内存里面。

效率会更高,第二个呢就是spark它这个容错性更好,它是引入了这种RDD的一个概念,那么第三个呢就是spark它的一个操作会更多,而是支持这种复杂的操作函数,比如说map filter。

flat map嗯,Grp key group group by,然后union join salt这种,就是说spark这些操作都是可以支持的,那么在HODP里面呢。

可能你要自己写这种map reduce来完成好,那么我们这是他的一个对比啊,这个可能就是说嗯,是需要大家下去看一下一些具体的资料,那么spark它的一个适用的场景是什么呢。

spark它是适用于复杂这个地方,我们先把这个具体的一个概念,给大家快速的过完啊,然后看一些基础的操作,spark呢是支持三种场景,比较正支持三种场景,第一个呢是负担的一个批处理,就是说时间跨度比较长。

就是通常是呃就是数10分钟到几个小时,这种是离线的一个查询,离线的一个处理,那么这种呢,一般在我们做这个数据报表的情况情况下呢,是非常非常常见的,斯spark呢还支持这种基于历史数据的交互的查询。

就是说它可以spark是支持这种,像IPATHON那种运行环境一样,就是跟Python环境下这种可交互的一种这种查询啊,这也是支持的,那么他的一个时间呢,通常是在这个呃十秒到数10分钟之间。

spark呢还支持这种流流失的一个数据处理,流式数据处理,就是说我们的数据它有可能是源源不断的来的,就说我们的数据集它有可能是源源不断来的,那么我们也可以根据这个流失的数据处理,来进行一个具体的操作。

那么这个呢可能spark它是用这个spark streaming的一个,操作来做做的啊,这个速度呢有可能是呃,就是说从几百毫秒到数秒之间,那么呃这个呢,就是说我们现在在大公司里面用到的呢。

嗯主要是第一种和第三种比较多,第一种主要是这种离线任务,那么spark的第三种场景呢,就是说这种实时的任务,那么有同学可能不太理解我们的第三种,这种数据流失的任务啊,我给大家举个例子。

就是我们的一些用户他的一个购买行为,比如说我们在这个淘宝上的一个额用户,点击用户点击对吧,基本上大家可以体验一下,就是我点击了某个商品之后,基本上10分钟以内,或者说几秒钟以内。

我再打开另一个商品的时候,其实他已经马上就给我推荐相似的商品对吧,那么这个呢其实它背后也肯定会用到这种spark的,流失的数据处理的操作啊,就是说流失呢就是说我们的数据流,这个数据呢它是源源不断的来的。

就相当于我们这个淘宝的用户行为数据,他的训练就是说他这个测预测集呢,或者说这个用户的行为是源源不断来的,不是说我们只把这个数据集导成这个CSV文件,然后进行预测,不是这样的啊,就是说它是源源不断来的。

这个呢现在也是有很大的应用场景啊,现在第三代的这个呃大数据与框架就是FLINK啊,也是基于这种流失的一个处理,那么需要注意的是就是spark的这种流式处理呢,基本上也是基于B期处理的。

也基于批量的一个处理的,那么spark呢我们再看一看啊,把这页PPT讲完,我们就看一看它的一个代码,spark呢它有就是说我们现在一般情况下呢,说的是他的一个比较建议学习,他的一个就是2。0的版本。

就是比较高的版本啊,那么这个地方呢就需要注意的一个点,就是我们的一些概念额,那么spark呢从2。0就是说或者更高的版本呢,就是支持这个叫spark session的一个嗯操作。

spark session呢它是呃就是说是各种不同,就是说context这个组合,那么通过spark session呢,我们可以就是说操作一下的啊,比如说创建和操作RDD的。

我们如果原始的呢是用这个spark spark context,那么我们用spark session也可以操作啊,比如说我们操作streaming的,或者说我们操使用circle的。

或者使用have的啊,这些呢我们都是可以从spark session里面进行,一一起操作啊,一起操操作,那么这个spark session呢它怎么进行一个,就是说呃一个定义呢,就是说我们直接把。

如果把这个这个下面的代码是这个py s spark啊,就是Python就是spark的Python接口啊,那么我们如果把这个spark给它安装好了之后。

我们直接从这个用这个语法里面from py s spark,The circle,Import sps,Sparks session,或者说你创建了一个PYSPARK的一个环境呢。

它会默认就是说引入这个spark session啊,那么通过这个spark session呢,我们可以构建我们的具体的一个嗯,就是说这个具体的一个实例环境,你怎么构建的呢。

smc session点BDERBEARDER,就相当于是我把它创建一个环境,然后我们设置一下我们这个环境的一个app name,以及我们的一个CONFIG,CONFIG呢,就是这个app name呢。

是我们这个相当于是这个APP的一个名字啊,你这个应用程序的名字,然后呢我们就是说具体做一些配置,比如说这个地方是,其实是一个KV的一个配置啊,然后呢go or create相当于是创建一个好。

那么我们来实践一下啊。

来实践一下,我们再切一下屏幕,好拖上去的啊,额大家看一看,我这个地方我有一个notebook啊,这个notebook呢我们其实我已经在我这个本地环境,已经把他的一个呃就是说spark环境给它安装好了。

大家如果自己安装了,直接是额就是说应该是这个呃,就是派app in install e呃,install e spark就行了啊,如果他在安,就是说安装等你安装之后呢,遇到什么问题呢。

可以就是说咨询一下注销,或者说网上查一下,都有一些解决方案好,那么我们这个地方呢,spark session它到底是它的的功能是什么呢,我们在PPT里面给大家讲了,spark session呢。

基本上就是说我们上,就是说他能够操作很多事情对吧,比如说我们的一个have查询RDD的,或者说streaming的都可以做,那么我们在创建它之后怎么创建呢,我们上面讲解的代码对吧。

然后这个呢就是创建了我们的一个具体的一个,呃就是说呃spark session,然后呢我们当然这个spark session呢我们创建之后呢,也可以就是说用我们这个原生的一个spark context。

这个呢就是说我们先操作啊,先实操,那么我这个呢就是创建一下啊,比如说我们把这个代码运行一下,他这个第一步可能还稍微有点慢啊,三秒钟三秒钟创建完成之后呢。

我们接下来需要注意的一需要讲一个点的,叫一个RDD,RDD呢,我们其实是我们spark里面非常重要的一个概念啊,但是呢它是偏概念的啊,我首先就是说给大家把这个讲清楚,RDD呢是spark里面基础的一个。

基于内存的一个操作啊,基于内存的操作,那么呃就是说我们如果大家之前没有学过,这个rd d呢,可能第一次接触是稍微有点复杂,稍微有点复杂的,那么RDD呢,也是这个spark里面的一个核心的一个特性啊。

核心的特性特性,那么这个RDD,你就是说,其实它它其实基本上就是,把我们的一些基础的操作,或者说数据转换的操作,我称为RGD,然后呢spark他还把这些具体的操作呢,用一个叫DV啊。

这个DAG就是说是一个有效无环图的,这个操作呢,把一些RDD把它那个就是说串起来了,比如说我们从一个数据,把它从最开始的创建到筛选到map到这个呃,就是说具体的操作,然后到最终的把它做聚合等等等。

等到再到最终的我们的最终的数据,就是说我们从最开始的数据,到我们的最终的数据,其实我们的代码,其实就是说这些变量的一个变化,我们或者说这些操作,我们可以把它构建得到一个有向无环图吧对吧。

那么我们这个数据它应该是没有环的,如果有环,那就有问题了对吧,有环境有问题了,那么这个通过这个呃,这种就是说我们的这种嗯DAG呢,其实能把我们的一个数据的操作呢,把它进行一个串联起来。

那么我们的spark呢,会根据我们的这个RDD的一个他的一个操作,能来把我们这个具体的一个哦,就是我们的操作在我们内存里面进行优化,而且呢它会告诉我们的具体的数据,怎么进行分片,怎么进行优化。

那么这个地方呢,我们大家再回过头来这个地方看这个叫spark session,swag session呢,其实大家之后如果学习这个TENSORFLOW。

那么你就会发现TENSORFLOW里面也有叫session in p,那么这个地方这个地方我们通过第一句。

可以把这些数据把它串联起来之后,有什么优点呢,那么这个第一个优点就是说,我我这个可以一起来进行优化我们的一个流程,而且呢假如说我们的流程啊,就是说他有这种跳接,或者说中间有这种嗯。

就是说我们的可以优化的点啊。

我们的模型可以帮我们来进行优化的,那么哦我们就是说这个IDD怎么进行创建呢,其实在这个spark里面它都可以帮我们创,就是说直接写这个函数就行了啊。

比如说我们这个地方用我们这个地方创建的spark。

Context,然后创建我们的一个range,一个14,这个14呢就相当于是我们创建一个额,0~13的一个列表,然后呢我们让他分组啊,相当于是分成四片。

然后我们这个地方呢我们它RDD呢就叫partition,partition呢相当于是一个分片的概念,然后呢我们就可以直接得到这样的一个呃,就是说一个RDD,那么这样一个数据呢,其实在spark里面呢。

我们还直接对它进行操作就行了,这个地方我们比如说把这个原始的数据,从0~13的对吧,我们想让它进行一个平方,进行一个平方,然后就是说从零对吧,零的平方,零一的平方,一二的平方,二三的平方三。

那么一直到13的平方169,那么需要注意的是,就是说这个这个操作到这,并不是说我们一下就计算的,并不是说一下就计算的,它是就是说我们的spark其实是一个lazy的,就是相当于是一个懒加载的一个概念。

或者说它并不是说我们这一行就直接计算的,它是到最终我们假如说你的result有康有收集,或者说显示的得到我们的一个结果的时候,他才会把我们的这个操作所执行。

也就是说,我们在定义我们这些RDD的一个流程之后呢,这个DAG并不是说马上就把,我就是说完成这个计算,它会根据我们记得到的这个有向有向无环图呢,来进行一个得到我们的一个额。

就是说这个计算逻辑,然后并不是说马上计算的啊,就是有可能就是说到你需要进行计算的时候,才进行计算好,这是一个RDD的操作,待会我们也会演示更多的操作啊,演示更多的操作。

那么我们再来回到我们的一个PPT啊,这个这节课呢主要的是一个实操。

我们再回到PPT。

那么我们刚才讲的这个RDD这个概念呢,它其实就是对于我们spark的最底层的一个,内存的一个封装,那么呃有可能有同学说老师这个地方嗯,我们假如说学习rd d,还需不需要学习一些其他的一些东西。

其实在spark里面啊,就是说我们现在你如果想要学的比较底层,或者说比较深入呢,那么RDD是需要的是需要的,那么我们在学习sparkle这种circle的时候呢,其实嗯还是比较常见的。

就是直接这种data frame,data frame呢其实在spark里面呢,它也是这种表格形式的啊,表格形式的,那么嗯表格就是一个二维的数据表,二维的数据表,那么二维的数据表,它本身提供的。

我们每一列带有一个单独的名称,和具体的一个类型,那么这个地方呢,就是说我们就相当于是我们创建了一个表格啊,得到一个表格,那么这个地方我们就多了一个信息,叫一个schema信息。

这个schema呢你可以理解,就是我们这个列名的名称和具体类型,这具体类型,这个呢有同学可能之前就就觉得,这个data frame和我们的一个列表就没什么关系,其实很有关系啊,大家可以设想一下。

我们在使用pandas的时候,其实这data frame它的每一列都是有一个类型的,d tab d tape对吧,所以说我们的一个data frame呢,其实是我们所有的表格的每一列。

它的一个取值或者它的类型都是固定的啊,固定的,那么呢我们的,但是呢data frame,它底层其实是用RDD为基础的一个呃,进行操作的,而且data frame底层的一个操作其实是基于好。

data frame的底层操作其实是基于RDD啊,那么其实是对RDD进行一个封装的,那么这是我们的一个data frame和RDD,那么我们就开始我们的具体的一个实操啊。

具体的实操,那么就跟着我们的一个notebook啊。

这个notebook我们待会儿课后就会分享给大家,那么呃在我们的一个呃RDD的操作的时候呢,其实很多就是你直接这个呢就是直接是拍嗯,这个嗯就是说spark的一个语法了,py s spark的语法。

比如说我们想得到这个RDD这个呃data的,它的一个所有的一个取值,这个地方呢,如果你如果啊我给大家执行一下,我执行的这样一行啊,好,我在执行这个RDD,大家可以看一下,他其实并没有。

直接把我们的一个数据给展示出来,这个地方,它只就是说只是展示了我们的RCDD,一个具体的一个信息对吧,具体信息,那么你如果想要把它一个取值给它取出来,其实就是RDD点connect i d d的可能。

那么这样呢才是把我们的所有的一个取值给他,数据给他取出来,那么如果我们想要把我们的一个这个数据的,一个首个的元素来取出来,那么我们就是说first first,如果我们想要取这个头部的五个,头部的五个。

那么我们就take5,那么我们如果你想要取值,这个相当于是最大的三个对吧,那么我们就top top3,当然你如果想要就是说把我们的一个呃,就是说take order,就是说用一个某一个次序来进行一个取。

比如说我们把它进行一个拉姆达变换,然后再做一个降序的一个取值,这也是可以的,然后呢,这个IDD不仅仅是支持这些基础的操作,还可以支持这种,就是说这个IDD还可以做一些统计,比如说我们做一个基础的统计。

就是说STATES对吧,比如说统计这个数据里面有多少个count,比如总共取值的个数,它的平均值方差最大最小,这个其实就是我们在pandas里面的一个,describe函数对吧。

那么比如说这个下面我们的count sumin对吧,这些都是跟我们的差不多的,跟我们的Python的语法差不多的对吧,然后呢我们假如说RDD想就是说取这种啊,就是说分桶或者分组啊对吧,这也是可以的。

这也是可以的好,那么RDD呢,其实它创建呢就是说我们创建,就是说直接从这个是Python的一个list对吧,我们就是说用它啊,这个嗯spark的一个context的一个PANONIZE。

就是从这个list把它转成一个RDD,那么RDD呢其实它可以作证,我们上面这个地方讲解的是RDD,它一个具体的一个呃,就是说统计操作,那么RED,其实它也可以做这种逻辑的一个筛选,那么怎么做呢。

比如说我们这个地方创建的一个list是额,这个data是从1~5对吧,那么我们首先对这个RDD做一个map map呢,就是说我们让他就是乘二,就是说这个地方原始是12345,就变成了2468十对吧。

那么我们把它作为一个转换之后,乘二之后呢,我们再做一个筛选,筛选呢,我们就是用匿名的一个函数,那么达嗯,如果看这个,就是看这个元素是不是大于五的对吧,然后我们数据它大于五的对吧。

好我们看一看就是说他是六八十对吧,那么当然这个就是spark呢,这个RDD其实也是支持,就是我们的一个字符串啊,字符串也是可以的,那么如果你是字符串呢,其实上面讲解的有一些函数。

它就有可能是就是说不能执行的,因为字符串其实没办法统计一些嗯,什么平均值等等对吧,那么嗯其实这个呃spark呢,它其实还支持一些高阶的操作啊,比如说我们这个地方的一个呃,呃字符串是一个list对吧。

Hello back,Hello world,hello world对吧,那么我们把它转成RDD之后呢,这个地方有一个叫flat map,flat map呢其实是呃非常非常重要的一个概念。

在我们的呃spark里面,那么它的一个操作是怎么样的呢,他的一个操作是怎么样呢,就是说我们的,我把这个每个元素把它进行一个,按照空格来分隔开,空格来进行分隔开,然后把它拼接到一起,比如说这个hello。

它最终转变成了hello spark,Hello,Hello,Hello world,Hello hello world,他是把每个元素把它分隔开,然后把它拼接到一起,然后其实这个操作就是说。

我把每个元素把它拆分,然后把它拼接到一起,是这样的啊,有同学问到这个这里的数,这里的数据0123也是可以,一个文件还是数据流吗,是可以的,我待会会演示他怎么读取文件的啊,怎么读取文件的好。

那么我们再看一看一个高阶的例子,高阶的例子,那么比如说我们还是用这个data,data还是这个字这这些字符串,然后然后呢我们把它用PANIZE呢,把它转成这个RTD,然后呢我们还是看着啊。

这个其实我们的一个RDD的这些,这些这些函数呢其实是可以进行一个,相当于是直接在后面点,然后直接继续增加的操作也是可以的啊,就是说我们把它换成两行也可以的,就是说我们再点一下,然后继续操作也是可以的。

这个RDD这个flamaflat map呢,我们上面已经讲了,上面已经讲了,就是说他得到的是这样的,然后呢我们把它做一个map操作,map呢就是说我们把map其实是一个KV的操作,对吧。

我们在之前已经嗯就是说可能看到过一些例子,map呢就是一个KV的操作,我们把每个X把它转成一个top x,比如说hello变成变成了hello1对吧,那么我们看一看它转变变成了什么。

变成了我们原始的是hello spark,Hello world,Hello world,那我们变成这样的,Hello one,Hello,1spark,1hello,一word1hello。

1word,一对吧,好他转变成这样,那么我们转变成这样的呢,我们还可以做一个操作,我们就是说我们把它做一个呃,就是说reduce by key,reduce呢就是说它也是我们spark里面的一个概念。

它其实是可以把我们的元素进行一个,累加累加的,那么我们这个地方我们是按照我们的一个,就是说,我们统计我们所所有单词的一个出现的个数啊,其实本质是这样的,那么我们就reduce by key,然后呢。

我们by,我们就是说相当于是根据我们的一个单词,进行一个分组,然后统计它出现的次数,那么我们最终统计的结果就是hello,出现了三次,spark是一次,word是二两次啊,当你大家可以看。

就是说他其实定义的操作其实是非常非常,就是说可能跟之前大家接触到的一些嗯,就是说操作不太一样,但是它其实是非常有效的,这个地方其实本质就是统计的一个word count对吧。

统计的所有单词的一个出现的次数,那么如果但如果我们想要做这个具体的一个,就是说这种集合在我们的一个spark里面,RDDE其实也是可以的,A这个I额data和B的data。

我们求这个具体的一个就是它的一个并集对吧,我们unit a u n b connect对吧,这也是可以的,然后呢我们假如说想他抢,就是说求并集之后呢,再取它就取它它的独立元素的个数。

那么distinct对吧,其实我们在这个嗯SQL里面,其实也是这种distinct的一个语法对吧,好对吧,我们就得到了1234,把这个重复的元素给它剔除了,那么这个呢就是我们的一些RE。

D的一些基础操作啊,当然这个只是带着大家简单的过了一遍,那么如果大家自己掌握呢,从头学起呢,还是需要有一定时间的,需要有一定时间的好,那么如果我们上面呢,其实这是RGE的基础操作。

那么我们其实这些操作呢也可以用这个呃,就是说其实我们这个地方其实本质对吧,我们这些语句,本质就是说对这个数据进行最原始的一个操作,比如说对它求对吧,求这些统计啊,求最大最小,或者或者说把它求转化。

那么我们接下来呢就是说我们基于这个呃,spark的一个data frame来进行讲,那么我们在创建这个spark session之后呢,我们就可以从这个应用程序里面,从从一个已已有的RDD。

或者说从已有的表格,或者说从文件里面读取一个我们的一个data frame,那么这个地方呢,我们读取的是一个我们本地的一个JSON文件啊,在我们本地放好的,在我们本地这个呃目录下面呢。

我放了一个叫people点JSON啊,那么这个文件里面就是这样的啊,是一个JSON文件啊,是个JSON文件呃,那么这个JSON文件呢,也不是说完完全全是一个合法的JSON文件。

这其实每一行就是一个KV的一个对吧,那么我们用这个spark read点JASON就是读取这个JSON文件,我们把它读取一下,读取完成之后呢,我们就不一样,这个地方就是它是data frame呢。

那么它的一个语法点show,我们就把这个表格给他展示出来,好就是长的这样的,那么大家可以看一下这个地方,我们的一个数据集,他其实有的地方还是缺失了对吧,我们的第一个人他没有A级,这就是没有A级字段对吧。

我们这个地方是缺失的是吧,那其他的我们的这些字段,其实读取的都是很正常好,那么data frame呢,其实它的这些语法其实在呃scanner,或者说嗯java或者说R语言或者Python语言。

都是可以一起操作的,就是说这些函数都差不多,那么这个地方的data frame,和我们的pandas的data frame其实是非常类似的,其实非常类似的。

我们可以根据这个地方的data frame的一些语法,其实可以参参照的,你实现一下我们的呃pandas里面的data,data frame的语法,比如说我们在Python里面可以通过这个DF点edge。

对吧,我们ten pandas there就是DF这个表格,DF是一个表格,A级是一列对吧,我们可以通过DF点A级,这个是啊pandas或者说DF括号A级,这样来选择pandas的对吧。

就是说这样呢其实是我们的一个具体的操作,但是呢在我们的一个嗯就是说嗯,sparkle py spark里面呢,其实也是嗯可以这样做的好,那么我们来看一看,在嗯就是说这个py s spunk里面。

怎么进行操作,那么首先注意一下,就是说我们就是创建一个具体的一个data frame,之后呢,其实就是创建了一个SK嘛,那么有同学还是不理解,这个schema是什么含义啊。

这个schema呢其实就是表明了,就是说我们这个表格的具体的格式,店名,及他是不是缺失,或者说我们这个呃这些列,它到底是怎么按照什么形式来进行存储的,这些呢都是我们这个data frame来。

就是说需要需要,就是说在创建这个表格的时候呢,需要进行操作的,那么我们如果用这个PYSPARK的prince schema呢,就可以把这个schema的一个把它打印出来,那么我们就看一看。

就是说edge呢是用none,然后冒号,然后呢我们name呢是一个string对吧,然后呢在我们的p s bk里面呢,我们其实选择某一列的某一列的进行展示,它是这样的点select,他不是说是我们的。

在嗯跟pandas as语法不一样啊,跟pandas as语法不一样,其实你看着差不多,它语法就是语法的差不差别,点select点show好,这是选择这一列,当然我们如果选择多列对吧。

d f d d select输入输入一个列表,然后点show好,那么我们这个地方在这个地方大家可以看一下,这个就跟我们的一个circle有点类似。

select我嗯D嗯DF点select df name以及DFH加一,那么这个地方就是说,我们在筛选这个列的时候呢,还把这个A级给他加上一呢,加上一了啊,加上,那么这两种就是说DF呃。

就是说select和DF和这个具体的name啊,这这两者都是可以通用的,你可以都进行通用的,那么在我们的一个具体的一个呃,PYSSPG的操作呢,它其实这些操作都是根据我们的一个呃。

就是说首先加了这个函数啊,比如说我们的具体逻辑选择,就是说DF点FA filter呢,我们的就是说具体的一个筛选逻辑,然后点show对吧,然后呢,我们假如说想要根据我们的A级来进行分组,来进行统计对吧。

我们的grop by it,然后点count点show,就是说这个具体的一个,它只是在一个具体的一个语法上不一样啊,其他的情况上呢都是相同或者相似的,DFGIE可以不更改列名吗,可以的,这个可以的。

这个可以不更改列名的,这个只是在这个地方,他是把我们的嗯,就是说就是它默认把这个操作逻辑,就把它匿名改一下,可以不更改命名的对,那么我们也给大家准备了一个具体的一个呃,PDF啊。

我不知道就是大家能不能看清楚啊。

我把再把它涂一下屏,我投一下屏啊,稍等今天准备的一个内容,主要是各个文分布在各个文件里面啊。

大家可以看到这个这个这个PDF吧,那么这个P其实很在spark学习的时候呢,就是很多的一些这个呢是一个呃RDD的一个,就是嗯一个操作,那么这个操作呢,就是你基本上我们常见的一些操作。

就是基本上我们这个PDF里面展示的,比如说我们创建我们的数据,创建我们的数据,我们可以从这个具体的一些呃,就是我们的list里面进行创建,也可以从range里面进行创建,然后呢。

我们也可以从我们的具体的文件里面进行创建,这也是可以的,我们从text file,或者说我们的一个,就是说具体的一个路径进行创建也是可以的,那么这个RDD创建之后呢。

我们就可以把它作为一个具体的进行一个统计,或者说基础的一个信息对吧,我们的count control value,然后我们的求some,然后比如说我们判断它的一个,最大最小平均值对吧。

这是基础的一些统计,然后呢我们这IDD也可以做一些,那就是说这种函数,比如说我们前面讲的这种拉姆达函数对吧,然后我们的一个就是说flat map对。

然后这个具体的一个采样筛选,或者说我们的一个就是说,我们这个IDD也可以写函数啊,写函数也可以具体操作的对,然后就是说嗯我们这些RDD的操作呢。

基本上就是涵盖了这些基础的一个数据的操作,比如说把它求和做分组,做统计等等等等啊。

一直到最后我们的一个输出输出,这个地方呢你可以输出到一些文件。

这都是可以的啊,这都是可以的,好,那么就是说我们这个R这个。

这个只是把RDRDD这个语法给大家介绍啊,RDD语法就给大家介绍,然后呢我们待会还有还有一些其他的,我们待刚才讲的这个呃py s spark的这些语法呢,我们待会还有一个PDF给到大家好,这是这个啊。

我们就继续我们的一个PPT,也就是我们的一个实操的内容。

看一下我的网页,在这。

好那么接下来呢我们就到我们的一个这个,其实我们前面这部分其实是一个data friend的操作,那么我们接下来呢可以就是说用一个嗯spark circle,Spark circle。

其实这个里面就细节非常多呢,就是说呃很容易遇到一些女同学,就说老师这个spark circle和就是说我们的data frame,它具体有什么区别。

或者说我们它这个spark circle和具体的一些circle,有什么区别,这个呢就里面有很多的一些细节和很多的内容,那么呃就是说spark呢现在大地学习啊,就是说如果要学好,可能要去花个spark。

要学好,他可能要花个至少两三个月才能完全从头学好,那么我们只能说,把这个基础知识和一些常见的用法给大家较好,然后呢,有同学可能说,老师为什么spark不就这么这么多函数,本来都记住不就行了吗。

嗯不是这样的啊,我们写spark并不是说把它写完就OK了,有时候我们还需要就是说把它写快,把它写快啊,好那么我们接下来就看一下spark circle啊,呃那么这个circle呢。

其实这个spark session呢也可以支持这种circle的,spark circle的这种方式来进行数据的查询,那么首先呢我们把原始的,我们这个people这个数据集呢。

把它转变成一个我们的一个tempo view,然后相当于是把它转成一个,就是说能spark circle能够查询的形式,然后我们来看一看,其实在这个地方下面,我们的spark circle就可以执行了。

Select circle,select新from people,然后点show,这个地方就和我们前面就是筛选得到的edge和name,这两列同时筛选得到的是一样的,是一样的好,那么下面呢我们就讲。

就是说这个这个下面呢是讲这个从RDD,怎么把它转成这个data frame啊,我们先把他留住啊,先把他留住,先讲一些更多的例子啊,可能大家听的还不过瘾,那么这个spark呢。

其实大家自己如果把这个环境安装好之后呢,学习起来其实是非常简单的,非常简单的,比如说我们还看一些更多的例子,就是说我们假如说创建一个更呃,就是说复杂的一个呃表格对吧。

我们有l class language mass啊对吧,就这这些列都是一些数字啊,这些数字,然后呢我们如果把它创建之后呢,这个是没有显示好啊,这个最后这个数据集呢,我们设置了他的一个数据。

还有他一个列名,然后呢,这个地方,我们这个地方上面也是创建了一个spark session啊,Spark session,当然这个你取自己的一个名字就行了,或者是不取也是可以的啊。

我们的CONFIG文件你可以取,也可以不取,把它创建好之后呢,我们也这个地方也支持DETEMPS,或者说你用这个print schema,也可以看这些列名的一个类型好,那么我们这个这些逻辑。

大家我们前面已经讲了啊,就select select的逻辑好,往下翻,讲了的,我就我就是说跳过啊,刚才讲了的我就跳过,那么我们刚刚才不是就是说有同学问这个,具体的一个就是说列名吗,对吧。

我们其实是可以把这个列名,就是说把它在circle里面叫alliance对吧,circle里面叫alliance,在我们的py s spark里面也是可以类似的啊,把它取的,把它取做一个别名也是可以的。

也是可以的,就是说我们的py s spark呢,它其实这也是支持这种,就是说类似,就是说这个地方其实跟我们的circle执,执行差不多的操作,比如说class等于一的线线得出来。

或者说我们的class like like呢,就是说让它是一开头的一开头的好,我们接下来就看一看sparkle一个circle啊,主要是看这个就是这个地方呢,我们其实是创建了一个临时的一个表啊。

从这个就是原始的这个test data frame0,把它创建得了一个test df,这个地方呢我们把它创建了一个临时表,然后可以用SSQL来进行查询对吧,我们sparks circle它是这样写的啊。

Spark circle,然后这个后面是我们的一个执行的语句,select是count新number count from test df,那么大家可以看到。

其实这个和普我们前面讲的这个circle的语法,其实是非常类似的,非常类似的,只不过它有一些细微的不一样啊,细微的不一样对吧,我们这个地方假如说count就是说心,就是说我们的心。

然后我们number count from我们的DF,其实就是得出我们的这样一个data frame,它是返回的是一个data frame,然后假如说我们想要把我们的数据,把它做一个排序也是可以的。

也是可以的好,那么spark呢也是支持这种缺失值的处理啊,缺失值处处理,我们就直接spark我们创建了一个呃,就是说我们这个地方呢,我们其实是从pandas data frame。

把它就是说转成了inspect data frame,然后这个地方就是说,我们首先创建了一个pandas的data frame啊。

然后把它从spark create data frame把它进行一个转换,然后呢我们转换之后呢,这个数据集原始的是有这种缺失值的,我们其实就直接把,就是说其实直接把它,尤其是值进行一个删除就行了。

删除就行了,然后呢spark的这些语法,它其实也是跟我们的一个circle也是差不多的,circle的也差不多的,就是说但是跟那个pandas的一个操作,其实是不一样的。

跟pandas as的操作可能还有点不一样,比如说我们group by我们的key,然后求每个分组下面的一个统计,或者说我们想要求更加复杂的,就是说我们group by某个key,然后求这每个分组下面。

比如说这个分组下面那个language的这个最大,以及我们的这个分组下面的一个language的平均,这也是可以的,其实这个我们用这个circle也是很方便,可以写的好啊,我们先休休息10分钟吧。

休息休息10分钟,我们继续,我们休息到九九点钟,继续啊,休息一会儿,我这个地方主要是嗯演示一些基础的一个语法,没有,就是说查数据库,查数据库也是直接在我们创建数据的时候嗯,连接数据库就行了。

就是说后面的语法是一样的,我这个机器上没有装数据库啊,对好那么我们继续啊继续,那么呃对于spark呢,它不仅仅是支持我们的一个数据的一个呃,就是说嗯一个操作还支持这种数据的一个转换。

嗯spark的一个转换,就是说数据转换呢主要就是需要大家知道,一,就是说我们从RDD怎么把它转成一个data frame,或者说这两者之间的一个交互,第一种方法呢,就是说我们通过就是它有两种方法。

第一种呢就是说通过一个反射推断来去推断,我们的包含类型的RED的EXCEA,这个地方呢,就是说是在我们创建这个具体RD1的时候,还需要指定它这个类型,让我们的代码,我们就是说知道我们的SK码的类型。

第二个呢,就是说我们是显示的去构建一个scheme,这个呢就是相当于是我们第二个例子啊,就是说显示的构建一个scheme,然后从我们的IDD数据来进行一个编码,然后呢这种情况呢它是呃会繁琐一点。

因为我们这个CHEMA是你手动要编写的,那么常见的就是说一般情况下呢,可能第一种就是说这种反射推断,可能会更加方便一些,更加方便一些,那么首先呢我们看一看我们的数据集。

我们数据集呢是这个本地文件的这个people,我们catch一下它,也是跟我们原始刚才那个JS文件差不多啊,只不过这个地方是个TXT,那么我们从spark里面呢把它读取出来,读取出来,然后呢。

我们把它这个读取的出来的,是一个RDD的类型的啊,那么我们把它做一个map,这个地方呢map我们就把它做一个分隔啊,就相当于是用客户进行分隔,然后呢,这个地方我们就说接下来我们是显示的指定的。

用一个肉肉呢,其实也是就是说对RDD的一个,就是说一个封装,只不过这个地方的封装呢,它是呃没有data frame那种,就是说表格的形式肉一般只是一个向量,或者说一个类似一个list存类型的。

那么如果我们把这个把它转成正一,一个就是说呃把我们的一个pass呢,把它转成两个肉组合的一种形式呢,那么我们再从这个people里面把它,就是说从我们的people这个2DD。

把它转成Mark的一个data frame呢,他会做一个就是说类型的一个推,就是说反射推断,反射推断,它会根据我们的原始的这个两两列里面的,一个取值的取值去推断它到底是什么类型的,来创建它的一个列名。

和他具体的一个列的类型好,那么我们再看一看在这个地方,我们的一个转换之后呢,我们的一个好听,就是说这个地方已经转成我们的data frame之后,然后我们再从这个地方来进行查啊,来进行查。

然后我们你可以看一下这个地方,我们往下翻啊,他会把我们的一个就是说这个D1D0列,也就是说我们的name面会比,会解析成我们的一个string类型,第二类呢会把它转解析成int类型。

就是它是会自动解析的,解析完成之后呢,我们就可以从中进行一个查询文件进行查询啊,这个地方我们的这个spark circle呢,它执行的返回的也是一个data frame,也是个data分。

这是第一种方法,就是说根据我们的一个类型进行一个反射推断,第二种方法呢就是我们这个地方说的,我们显示的构造一个schema,那么在这我们在构建一,我从我们的RDD数据把它转,手动把它转成一个呃。

就是说data frame的时候呢,我们可以就是传递一个呃就是说strut time,然后哦这个struck tap呢,其实嗯就是呃就是显示定义了,我们这个schema的一个类型。

就是说嗯我们每一列到底是什么类型的,比如说我们的一个在就在这儿啊,我们的呃就是说具体的列名是什么,然后我们通过这列名,通过它进行一个解析,解析之后呢,我们就可以把它的一个具体的一个就是说呃。

P结构把它做一个显示的定义,这样呢就是他没有进行一个反射的推算,他就直接是从我们的一个呃,就是说定义的一个struct tape里面进行一个呃,就是说这样转换的,我们还把这个schema把它转换进去。

把它传入进去,对这是两种转换方法啊,比如我们的一个pandas呃,这些呢其实也是呃,就是说空位可以从我们的IDD进行转换的好,那么这是一个数据的一个处理,那么我们接下来呢就讲这个具体的一些。

就是说在spark里面的一些呃机器学习的案例,那其实spark它的一个优点呢,不仅仅是它集成了这些很高效的数据操作啊,它还有这种很广泛的用途,非常广泛的这种嗯机器学习的。

不就是说支持了这种机器学习的算法,那其实spark的它支持的一些机器学习算法,基本上嗯它没有它支持的一些机机器学习算法,没有SKN里面全啊,但是呢它也是基本上是在这种分布式的呃。

就是说大数据框架里面支持的比较好的,支持比较好的,那么我们就来看一看啊,我们首先呢是看一看用spark,如何用它来完成一个文本分类的一个案例,文本分类的案例啊。

然后我们首先呢创建一个spark session啊,需要注意的是啊,我们这个地方你一个spark呢你可以创建,就是说我们这个地方是多个notebook同时运行的啊,我好几个LOTUBOOK同时运行。

这都是可以的,他跟GP这个地方呢它主要是受限于你的一个,就是说我们的一个嗯具体的内存啊,就是说它不是说我们只能创建单独的一个session啊,好,那么我们已经把数据集给大家,传到我们的网上啊。

大家直接w git下载下来好,首先呢我们这个原始的数据集长的什么样的呢,长什么样呢,我们从这个spark csv把它读取进来,这个原始的是一个TXT啊,原始的一个TXT,我们呢让我们的spark呢。

它是自动去推断我们的一个scheme,推断我的类型,然后设置一下我们的一个分隔符,其实这个和我们的一个pandas的那个呃,具体的语法差不多对吧,那四点,额有两列,第一列呢是我们的一个邮件的一个。

就是到底是不是垃圾邮件的一个类别,第二列呢是我们的具体的这个呃词不上啊,就是邮件的,那么我们对于这个呃data frame呢,其实我们可以把它那个列名做一个转换。

这个呢就是说with column relam,就是说把这个C0把它转成,就是取另取个名字叫class,把他名字转一下啊,然后我们把这个C1把它转成那个叫ticket好,转成完成之后呢。

我们的数据集长这样的啊,好,那么接下来呢,我们需要可以把我们的数据集做一个,具体的一些处理,那么这个地方啊,其实斯巴克嗯,对我现在卡了吗,有没通,我刚才卡了一下嗯,大家能听到声音,能看到屏幕吗。

我现在哎喂,大家能看到声音好听到屏幕吗,OK是吧,我刚才这个地方显示它连接断了啊,真的没问题是吧,刚才应该是卡了一下,刚才应该是卡了一下好,那么我们首先呢把我们的数据集,做一个具体的处理,做一个处理。

那么其实这个地方啊,我们这些我们首先呢好统计一下我们这个字符,这个字符的具体的一个长度,我们就是这样这样写的啊,其实这个地方大家可以看一下,我们这个地方不是select啊,这个地方不是select不。

我们直接取一个名,取一列名字叫对吧,with conn就是新增一列,这里新增一列呢叫length,他是怎么得来的呢,就是说求我们这个TXT这一列的,具体的就是说它的一个长度,具体长度。

那么求出它长度之后呢,就是我们把它原始的一个data frame给它覆盖了啊,覆盖了,那么我们就新增了一列,新增了一列,那么新增一列之后呢,其实我们接下来就可以算一算对吧,我们其实也是可以统计一下对吧。

我们grp by class,然后算新增页的内,具体的呃,就是说不同类别的下面的一个平均的一个,就是说我们的一个字符的一个个数对吧,arrangements grp by mean对吧。

其实这个语法跟pandas其实是一样的好,那么接下来呢就是我们TFIDF的吧,这个其实在我们前面的课程已经给大家讲了,但是呢在这个地方其实它是基于spark下面的,可能他的一个语法上有点不一样啊。

那么其实但是呢它的一个基础的流程,也是一样的,首先做我们的token,然后或者说做分词对吧,做完分词之后呢,然后做我们的一个具体去数形容词,然后我们的CONTROVECTOR对吧。

然后算我们的一个TFIDF,然后就是说做我们的这个地方啊,string index其实就是一个嗯label encoder的操作,就是把我们的一个,而class呢把它转成一个具体的一个呃。

就是说原始的是一个字符串,两个字符串我们把它转成一个数值好,那么我其实我们其实它其实非常简单非常简单,那么这个地方就是我们把我们这个地方,我们其实在这个地方其实是没有操作的啊,在这个地方其实没有操作的。

看一看他在哪啊,他其实是在我们这个地方前面值定义的,这些具体的操作,具体token就是我们input的列名,以及我们output列名,然后他这个地方是没有具体操作的,在哪呢。

在这个地方这个地方大家看起来有,是不是有点熟悉,在我们的SK里面也有叫pipeline的,在我们这个地方也也也有叫pipeline对吧,我们首先把我们的这个我们的HMHPAM。

这个地方是就我们这个地方定义的,上面所定义的对吧,我们的一个label encoder就是把我们的类别,我们类别把它转成一个具体的编码好,转完之后呢,我们做一个分词分词,分词分词之后呢,我们去除提容词。

然后统计做一个CONTROVECTOR,然后做我们的一个IDF,然后再做一个clean up对,然后clean up呢,就是相当于是我们具体选择的是哪些列好,这个呢我们定义呢我们的一个嗯。

流水线或者pine之后呢,它可以直接就是说整体的对我们的数据集进行,FE条transform,这个其实和我们的s kn其实本质差不多的,流程差不多的,那么在我们的spark里面呢。

其实也是支持常见的机器,常见的一些机器学习算法啊,常见常见的一些机器学习算法,就是说我就是说他的一些,基础的一些机器学习算法,就是说包括什么普兹贝叶斯逻辑回归树模型,随机森林这些他都是支持的啊。

这些他都是支持的,比如说我们这个地方把这个PSBUKM2classification,里面的嗯,普斯贝叶斯把它input就行了,然后我们直接使用的是默认的这些嗯,就是说配置默认的配置。

那么我们把我们的数据集把它转换好之后呢,我们选择我们想要的列,那么我们的列就转成这样的啊,这个就是我们去就是得到的这个列the列,然后就是说这两列,然后label已经把它装好了。

features也把它装好了,然后我们就送这个地方呢,我们把数据集把它按照hold out的方法,就是70%的数据集,当做我们的一个训练集,30%的呢当做我们的测试集好,然后呢。

把我们的训练集送入到普斯普斯贝叶斯里面,进行一个训练,然后我们这个地方把我们的一个呃,就是说测测试型把它就是说做一个打分,然后受大家可以看,基本上就是说得到了我们最终的概率,一个情况。

以及我们最终的一个概率值对吧,那么基本上就是说,这个这个普斯贝斯得到的算法,这个算法呢并不是说很准确啊,并不是很准确,但有一些还是没有预测得到的,比如说真实的内部是这个地方应该预测错了。

但是呢这个notebook基本上是演示了这个,py s spark的一个基础啊,p s bk的技术,就是说我们怎么从原始的文件里面把它,一步一步的把它进行一个转换,然后输入到训练里面的。

然后有同学可能说老师,我们这个地方就是说我能不能我我不用pipeline,不用这种pipeline的操作,我直接就是说一步一步把它转化,就是相当于是我们用这个嗯,就是说你用嗯spark circle。

或者说psl spark内置的这些函数来进行转换,然后再送入到我们模型来训练,其实这两者都是一样的啊,两者是一样的,然后我给大家解释一下,为什么这种PAPINE其实是非常有优势的啊。

在SQUN里面呢也有这种pipeline是吧,在py spark里面也有这种排pine,pipeline的一个优点,就是说其实他是就是说我们的这个pipeline呢。

它是基本上是它的pipeline原生的一个含义,就是说是一个流水线,流水线流水线的翻译翻译是吧,那么sparks里面的pipeline,和这个SKN里面的pipeline,其实在实线上啊有点类似。

有点类似,因为我们的这个原声的这个呃,就是说我们的具体的一个操作呢,就是说他其实是有可能是有这种间隔的,那么如果用pipeline呢,它可以就是说我们的一个4spark的排布呢。

它可以帮助我们来优化这个具体的一个操作啊,优化的具体的操作对,而且呢我们的一个spark pipeline呢,它可以就是说我们定义好了这个pipeline之后,我们就不需要洗。

就是说相当于是定义了一个函数啊,定义了一个管道,一个函数,那其实可以帮助我们,就是说直接对我们的数据进行一个处理,直接对我们的数据进行处理,那么这个地方呢,嗯pipeline。

它不仅仅是支持了我们这个地方的,fit和transform啊,他假如说我们在这个PAPINE里面,加入了我们的一个评估器,就是说加入到我们的一个额,就是说你在这个PAPON里面,也可以加入我们的模型。

在后面把我们的模型加入进去,也是可以的,也是可以的,pipeline的一个管道,就是说我们可以把这些具体的操作传入到我们,pipeline里面,然后这个这个呢,可能也不是说所有的操作都能传输进去啊。

也不是说所有的操作都能传输进去,这是这样一个知识点好,那么在我们工业界里面,其实弄到PAYPINE的一个情况也是非常多的,也是非常多的,因为你假如我们从头就是说把这些token哪个呃。

就是说具体的操作做分词,然后写代码呢可能会写的非常多,就是说可能嗯就是说写的,就是说代码行数非常多,如果用PELINE也会更加整整洁一点,然后有同学可能会问到,就是说我们这个地方我们这些具体的一个操作。

就是说我们到底是为什么不能用SQL来实现呢,就是我们刚才不是用这个p spark circle,ark SQL也能实现,就是说就是说这些数据处理啊等等等等对吧,其实是这样的啊。

就是py s spark呢,它spark它是提供了,就是说你可以用嗯,就是说SQL来进行具体的数据处理,也可以用这些函数来操作也是可以的,就是说看哪种更方便啊,哪种更方便嗯。

就是说也是看它内置了有哪哪哪一种,有具体的这种我们想要的功能,然后我们再去进行继续的具体的选择好,那么这是一个文本分类的案例,那么我们接下来呢看我们还是讲这些,就是之前讲过的这个泰坦尼克号的一个案例。

泰坦尼克号对吧,大家还记不记得,就是说是预测,根据这个乘客的一个信,就是基本信息来预测这个乘客是不是幸存,我们已经帮大家把数据集已经给他下载好了啊,然后我们就来看一看这样,那么在spark里面呢。

其实如果我们想要手动,对我们的数据集进行处理,当然也是可以的啊,也是可以的,比如说我们就是说这个我们首先得到,我们把我们的数据集读取进来,然后呢我们得到我们的第一行,第一行得到之后呢。

假如说我们不想读第一行对吧,我们把第一行给它剔除掉是吧,把它剔除掉好,然后呢,如果我们想要手写这种什么字符串的一个转,换的一个映射,这都是可以的,就是说我们这种就是手写的,这个把我们的mail映射成一。

然后把FMMAIL映射成零对吧,这living encoder其实你手写也是可以的,也是可以的对,然后呢我们也可以把这些具体的我们的额,就是嗯这个数据呢把它进行一个拼接,然后把它进行一个转换。

在我们的ex spark里面,也是可以具体的用这些函数来进行实现,执行完成之后呢,我们还是用我们的windows split把它进行一个分割,分割成70%的呃,去年节30%的一个测试期喝一点水。

然后呢我们这个地方是就是说从这个m l lip,也是p y s spark内置的机器学习的模块,然后import我们的随机森林,当然在我们的随机森林这里面呢,其实这些设置的一个超参数。

和我们SKN里面的一个超参数是可以供,就是通用的啊,只不过他的一个取名不一样而已,然后呢我们把它定义好之后,然后就可以进行一个具体的一个训练和预测了,预测完成之后呢,我们就可以把我们的预测结果用嗯。

它里面的一些评估函数,比如说这个地方呢,我们是定义这个二分类的一个准确率对吧,然后我们就可以看一看弹里啊,这个地方不是二分之主曲率,这个地方它应该是可以计算更加清楚的,比如说这个地方的一个PR。

以及它的具体的AUC都可以计算出来对,那么这个的操作呢,基本上如果是在我这个机器上呢,是12核的一个情况下呢,训练起来是非常快的,训练起来是非常快的对,那么我们嗯就是说这些数据处理呢。

我们也可以从就是说用这个具体的,不用我们上面这些操作,也可以用这个具体的呃,这些我们刚才讲的这个select语法来操作,这也是可以的,比如说我们把数据集读取进来,然后筛选我们想要的列。

然后把我们的具体的这个地方的cast,其实是做一个类型转换,把它转换成一个我们的一个float类型的,然后呢把我们的一个数据集,把它就是说剔除我们的一个缺失值,缺失值剔除完之后呢,把我们的数据集。

按照我们的一个比例来进行一个具体的拆分,然后呢我们这个地方啊,就是说你如果不想就是说从pipeline写,其实也是可以的,这个地方的一个string index呢。

就是说把我们的这一列把它做一个label encoder,就是说把它从这个字符串,把它转成一个我们的一个数值,然后在n spark里面呢也是支持这种常见的这个网,就是数据处理。

比如说one hot encoder也是可以的,也是可以的,那么如果我们把我们的数据集转换好之后呢,我们还是可以用这个额,我们的一个额Z40来进行一个训练,然后训练好之后。

然后把我们的一个就是这个地方transform呢,其实是把我们的训练集的一个,就是说做一个预测啊,把我们的训练集做一个预测,然后可以看一下他的一个预测结果呢,其实和我们的真实标签其实是嗯差不多的。

这种写法呢其实是没有pipeline的一个方法,那么我们也可以把PAPINE加上,Pamine,加上呢,就是我们把这些操作并不是说直接来完成,只不过是在这个pipeline这个地方,就是说来完成的。

我们能用pipeline来进行fit,用它来进行transform,那么如果是在这个地方呢,大家可以看一下,是在每一行每一行后面来进行一个操作的,如果说pipeline呢,其实就写的更加简洁一些。

直接在最后啊,直接在我们最后这个地方来进行一个,Fit transform,这是一个pipeline,好那么我们py s spark呢,就是说还是需要大家自己下去进行一个练习啊。

当然就是说如果大家之前没有接触过的呢,可能稍微了解起来会有一点就是说懵逼。

或者说不熟悉啊,我们再给大家看一个,就是说我们的一个准备的一个PDF,就是说我们的一个spark circle的啊,切一下屏,找一下好,大家能看到屏幕吧,哎没拖上去好。

拖上去了,那么我们还给大家准备了一个,具体的一个速查表,这个速查表呢就是展示了我们这个呃,就是说p s spark和spark circle,它具体的一个就是说操作。

首先呢就是创建spark session啊,就是说大家我非常建议大家自己来试验一下啊,就是说自己跑一遍这些代码都可以直接跑的,直接直接就跑了,就是说我们首先呢创建一个spark session。

然后呢我们从spark session,然后就是set他的app name以及他的CONFIG,然后呢我们这个spark呢其实它是可以自己的,就是说做一个我们前面讲的就是做一个音。

我们的一个类型的一个反向推断,这是可以的,就是从我们的具体的一个字,字段的一个类型来做一个转换,或者说做一个我们的显示的一个类型的定义,就是我们定义好,我们的一个具体的一个schema。

具体的SCHE码呃。

就是说我们从那个struck,struck field里面定定义我们的一个CHEMA的,它的一个操作,然后呢我们的一个呃spark呢,它是可以从就是说常见的呢。

主要是从这个就是说从JASON或者说从TXT里读取,也可以从我们的数据库读取啊,我们在周五的课程呢给大家演示一下,从数据库读取,因为我本地是没有数据库的,我本地因为我自己在家里面啊,不是在公司里面。

所以说本地没有数据库,那么如果从spark呢,我们其实就可以从它里面读粤语的点CSV,也可以从spark里面点read,点JASON都是可以的,都是可以的,或者说从TXT都是可以读取的。

那么spark呢它这个语法就是这个语法呢,其实和SQL的语法其实是很类似,很类似的,那么只不过呢他这些操作啊,就是说有可能同学说老师这些操作,他跟那个circle相比,它的效率哪一个高,其实两者差不多。

两者差不多,就是看你自己写的一个逻辑,就是说就是说可能啊就是说你写的高不高效呢,有可能你是Mark写的不好的情况下呢,可能就是会比较慢对,那么比如说我们想要选择某一列对吧,select某一列嗯。

select是两列对吧,Select first name is last name,比如说我们想要选择对吧,我们的额多列,然后呢或者说做某列的一个具体运算对吧,我们前面也给大家演示了。

或者说根据我们的具体的一个逻辑,来进行一个筛选,我们的列以及我们的行都是可以的对,然后呢这些具体的逻辑操作,其实是可以进行一个呃就是说并联的啊,具体具体并联的对。

那么这个地方就是说spark呢其实也是支持,就是说写一些常见的,比如说like这个呢NIKE就是说我们它是用嗯,这个last name呢是以史密斯开头的,或者说他是呃就是说first呃。

或者说以什么什么结尾的啊,就是说start with或者说end with都是都是可以的,都是可以的,或者说我们取取这个first name的,就是说从中间那个字符或者嗯中间字符之后呢。

我们再把它叫一个单独的名字对吧,这些在spark里面都是可以的,都是可以做的,那么有同学就是还是可能会有疑问,就是说这个地方我们用这些操作来写,和我们用circle写哪一个更加就是说方便。

或者说为什么我在这个地方是这样写的啊,其实是这样的啊,就是说如果是用circle呢,我是建议就是说circle它不太嗯,就是说怎么说呢,circle也可以用circle,也可以用这种语法也都是可以的。

就看你自己的一个习惯,看你自己的习惯,那么如果是用这种呢,其实我们是可以把中间结果给它保存下来,而且你可以随时点show,可以把它啊,就是说呃就是说上传一下啊,嗯有同学说可以把这个课后上传一下吗。

可以的,我上完课马上就把我们的课件上传一下,对就是说有同学有同学就可能会有疑问,就是我们这个用这种语法和我们的一个呃,就是circle,其实它的一个具体的就是说我们哪种比较优,其实是都是可以的。

都是可以的,只不过我们用这种函数式的一个写法呢,vs bug技法呢,我们可以随时把中间中间变量把它打印出来,这样呢是非常方便调试的,你如果是用circle呢,其实就不太方便了,不太方便了对好。

那么如果我们想要增加一些列对吧,我们就用vs color vs color,如果我们想要更改这个列名对吧。

更改命名,我们就是呃这个地方呢,它其实是呃with column relame,就是我们更改我们的列名对。

然后呢如果我们想就是说drop啊,drop就是说相当于是我们删除我们的细节。

这都是可以的对,然后大家可以看发现这个地方我们的一对吧,我们上面讲的讲了一个叫lance,这个地方其实是一个在SQL里面叫个取别名啊,取别名它跟我们下面这个不一样啊。

这个呢相当于是永久性的,就是说改改变这个alliance呢。

相当于是我们的一个取的一个别名,就是临时性的,临时性的好。

那么我们的这个PYSSPK呢,我们刚才也讲了,他是支持这种grp by分组,然后做聚合的,这也是可以支持的啊,其实它跟就是说你可以理解它就是一个data frame,然后做这些具体的操作。

然后呢呃我们如果是做这种逻辑呢,你可以在这个嗯select里面就是说做也可以,先我们做FTER里面做也是可以的。

然后呢,我们这个py s spark也是支持这种排序的啊,就是说按照某个某种方式做排序。

然后呢,p s spark也是支持我们的一个缺失值的填充,和我们的缺失值的一个具体的一个操作,那么需要注意的是啊,它默认可能只是支持这种常见的缺失值,填充方法,你如果想要比较复杂的,确实是填充方法呢。

可能就需要有一些其他的操作,可能就需要一些其他的操作了,对,那么这些其他的操作呢,就是需要就是你可以写函数来做啊,就是你可以写这种具体的一个函数来做的,我们的这个缺失值填充。

就是说我们这个也是可以写函数的。

也可以写函数的好,那么我们假如说用这个,就是说把它注册成我们的临时表,然后从SQL里面进行查询对吧,我们把它呃就是说转转变成临时表,然后呢从我们的circle里面进行查询好。

这个呢都是可以的,然后假如说我们把它具体的数据,就是说我们把我们的data frame,把它转成RDD对吧,或者说把我们的data frame,把它转成我们的pandas啊,就是说转成我们的panda。

就是说嗯Python下面的pandas,的一个data fra码都是可以的,或者说把它嗯to jason to我们的TXT都是可以的。

而且呢就这种情况,这种啊并不是说只能写文件啊,当然也可以写数据库,你可以写数据库的,就是说我们把它就是说就是按照我们的MYSQL,或者说某种搜,就是数据库这个逻辑,把它写到我们数据库里面也是可以的,对。

那么需要注意的是,就是说大家可以在自己自己的一个机器上,或者说在我们的给定的这个环境上面,就是说试试验一下这个嗯,就是说我们的一个呃,spark的这些语法基本上都不难,而且我们给的这些例子啊。

都是可以直接跑通的,可以直接跑通的好,那么我我们再嗯继续我们的PPT的一个内容。

PPT的内容,那么我们这节课呢,基本上就是嗯想让大家了解这些spark的一个,它的一个特性啊,一些基础操作,就是说理论上呢并不是想要让大家掌握很多,因为一节课其实讲不了很多理论啊。

主要是想把我们这些实操的一部分呢,给大家讲完,那么我们其实刚才也讲了两个,具体的一个机器学习案例,当然spark里面还支持一些其他的,比如说我们的spark里面也,现在spark高级高版本呢。

也是在慢慢把这个GPU的集成里面,也可以加进去啊,GPU集成也可以加进去,就是说也可以使用GPU的嗯,那么spark也可以支持聚类的好。

那么我们接下来呢还有一个表格,其实就是呃就是说我们如果是额,就是说不想用spark,那么我们其实在现实生活中呢,还有这种have have呢,其实他其实跟spark长得有点类似。

就是跟spark的circle长得有点类似。

但是呢他跟我们的一个嗯,其实have呢其实是跟我们的一个circle长得差不多,但是呢它其实是一个have的一个查询语言,那么have呢它其实一般情况下,我们不是说是一个数据库啊。

不是就说很简单的库数据库,它是一种分布式的一个存储,那么我们的一个就是我们其实是可以,用我们的一个呃,spark这个环境去查have里面的数据的,当然也可以直接从我们的一个嗯。

have的一个web ui去做具体的一个查询,具体查询好,那么我们看一看他这个基基础语法,其实其实have的语法和我们的一个SQL的语法,其实大体上差不多,大体上差不多,只是有细微的一些差别。

那么就是说你学习这个SQL,基本上记住这样一个逻辑,或者说这个SQL的一个次序,这个啊就是说这是我们的一个,就是我们的一些标,就是说关键的一个语法单词对吧,Select from where grp。

Grp by heaven cluster,或者说我们的一个SBY,然后limit,然后呢大家在我们写have的时候呢,或者说写SQL的时候呢,就需要把我们的具体的一些,这个这个次序不能乱啊。

有同学说老师我们这个地方是,其实是是不是我们这些单词的一个次序是嗯,不能乱,就是说能不能乱续写,就是说把我们的select和from from把它换换个位置,其实不能的啊,其实是不能的。

就是说呃我们这个就是这些单词的一个次序,就是要按照这个次序写,不能把它按一个,不能把他的一个次序把它一个转换,不能把这次序做一个转换啊,那么我们的select呢其实是主。

主要就是给出我们想要选择的哪些列名和哪些,我们的数据集,就是说我们的列名,然后我们的from呢主要是我们的,就是说具体的这个数据的来源,where呢是我们做这个VR这个地方。

其实是可以做我们的具体的一个逻辑,而且呢也可以做具体我们表格做聚合的时候,对吧,这个表格的某个键和另一个表格的某个键,做一个连接,grove band呢其实是做我们的一个分组,就是我们从哪一列来做分组。

heaven呢,就是说我们在这个地方就是说heaven,我其实前面没有讲到例子,就是说heaven,其实是在做完我们的分组聚合之后再做一个呃,就是说逻辑的操作,就是我们这个地方。

其实where其实是对原始的表格,做我们的逻辑的操作,heaven呢其实是对group by之后的数据,做一个逻辑操作,然后这个下面呢是我们具体的具体操作,完成之后,然后做一个具体排序啊等等。

然后这些都执行完成之后,再再才到了我们的limit,这个limit就是最终我们展示的时候,它默认是多少,默认是多少,就是说默认是五个默认五行,或者说默认十行对,那么其实是这样的。

就是说我们的一个呃have的语法,其实或者说secret语法其实是这样的,就是说这个关键词不能乱,关键词不能乱好,那么嗯have呢其实在这里面呢其实也是可以做,我们有同学说的这个地点啊。

其实也是可以做的,嗯但是呢但是其实一般情况下,我们在呃公司里面这些DDI的权限会帮我们,就是说他是会帮我们的一个做回收啊,他会把我们的一些权限做回收,我们就是说在我们通过web ui。

或者说py s spark这些呃写这些代码的时候呢,他其实会就是原始的表格,一般情况下都不都不能让我们操作的,我们一般情况下呢是把我们的数据数据集,把这个数据集把它进行操作,然后写到一个临时表。

或者说把它做一个输出,我们一般情况下我在做上班的时候,其实没有直接改原始的表格,这个其实很危险,而且我一般情况下,也没有原始表格的一个权限啊,没有也没有原始表格的权限。

一般情况下就是做一个数据的一个ETL,对于数据的疑点,当然啊这个地方嗯就是说有同学说老师嗯,我我们自己能不能做这个,具体的就是数据的一个定义啊,其实我不建议你去学这个,我们怎么创建这些表格。

或者说你学习一下第一范式,第二范式,第三范式或者说数据库这些方式,其实你不建不建议你去,因为我们现在大家主要还是找这个,数据开发相关的哦,就是说我们算法工程师相关的,或者说想在大数据平台下。

掌握这些具体数据和算法,或者数据处理的一个工作的岗位啊,所以说这些数据数仓的这个呃知识点呢,其实可以跳过,我还是建议你就是说做一些,比如我们前面讲的这个spark的一些操作。

或者说这些have它这里面怎么做数据查询,怎么做聚合,怎么做group by这些操作才是大家需要掌握的啊,对那么这个我们的一个我们的notebook,这个PDF呢也会发给大家,也会发给大家对。

那么就是说我们在现实生活中,就是说在大公司里面啊,就是我现在在公司里面,其实have和我们的一个呃spark呢,都用have a spark都会用到,但就说看个人的一个习惯啊,就是说我现在比较习惯是用。

那就是说我们的spark,spark里面提供的一些机器学习算法可能会多一些,对,那么我们今天的一个就是说是提供了,再回过头来看一下,就是说一个是我们的spark的一个呃,基础的一个rd d的一个操作。

这个RDD,大家现在可就是说应该是有一点认知的,我们其实是个RDD,他根据我们的一个操作呢是构建了一个有无,就是说有向无环图啊,这个具体的操作,可能这些RDD之间的连接,是根据具体的一个我们的一个函数。

来进行连接的,对,然后呢,这个我我们就是说这个RDD的一个操作呢,其实也是影响了很多的一些机器学习框架啊,就是说影响了很多的机器学习框架,我们讲了这个IDD之后呢,还把我们的一个具体的一个嗯。

data frame的一个语法进行了一个讲解,以及我们的一个就是说我们的spark circle的一个,具体的操作,以及我们RDD和这个具体data frame的一个交互,对这些进行讲解。

然后呢给大家讲了两个,我们的一个嗯,4spark的一个具体的一个机器学习的案例,当然这个地方我们两个这个机器学习的案例啊,并不是说只有这两个啊,并不是说只有这两个,我们还有一些其他的。

都是就是说可以给大家可以给大家演示,但是呢由于时间原因,我们没办法把所有的东西给大家展示,那么我们在实际的工作过程中呢,其实我们这个地方,他其实就是说我们在工作过程过程中呢,其实这个原始的输入呢。

很有可能是我们从数据库,或者说我们从对吧,这个地方其实是读取的是CCV,其实也是可以从我们的一个数据库,或者说从一个呃临时表进行读取的,呃现在我自己做的一些呃模型的训练呢,一般都是离线的啊,离线的居多。

呃线上的呢可能是这种嗯,就是说线上的呃,就是说使用这种嗯线上的预测,牛市预测嗯也会很多,就是说是离线的训练和在线的预测,是这样是组合的,所以说呢大家就是学习一下spark的一个基础语法。

然后能够把这个跑通啊就够了,因为我们大家之前如果没有学习过我们的circle,可能学习这个可能会有点困难,对,那么我们再就是说我回到我们的一个PPT啊,就说最后一页啊。

就是进行了稍微的一个总结啊,今天主要是一个实操啊,讲完了就没有了。

讲完了就没有了,就业就是说其实circle呢是我们的一个基础,不管是学不学计算机的啊,就是说你如果之后想就业,跟计算机就业相关的啊,都是需要掌握SQL的,而且呢也是大数据开发的基础啊。

SQL呢不仅仅是就是说数据库主管理,管理的这种SQL have里面呢也有这种SQL的语法,而且呢其实我们刚才讲的这个pandas circle home spark,它其实本质对数据的一些操作。

比如说统计聚合分组以及他的比如说这种map啊,或者说匿名函数啊,其实本质操作都有很多语法都是差不多的啊,只是在我们的函数的名称里面,或者说有一些区别,第嗯这是第二点,第三点呢就是说spark。

它是我们比较成熟的一个,大数据的处理和训练框架,是建议大家掌握的,但是如果大家是嗯就是说想找这种,就是说我们纯算法开发的啊,就是说可能这部分就是说稍微欠缺一点,是可以的。

但是如果大家想找跟这种ETAL相关的啊,这部分是非常建议大家掌握的,那么有同学说,就是说我们学习的今天这部分内容,其实是不是就够了,我跟你这样说啊,今天这个只是一个引子啊,抛砖引玉。

只是还有很多的一个内容,是需要大家进行学习的,我们在spark里面呢,这个我们的RDD,它里面有具体的一个操作逻辑对吧,那么RDD里面怎么做,我们我们算计算的一个优化,以及我们RDD怎么做。

我们的一个就是说我们的网络优化,和我们的计算优化,这里面有很多细节和很多内容啊,我而且呢我们也嗯也没办法给大家讲,所谓的例子,这个地方有一个链接,就是spark的一个头推二,它里面讲解的所嗯。

基本上一些高阶的IDD的一个操作,嗯如果大家感兴趣呢,也可以看一下嗯好的,那么我们今天的一个内容呢就这么多,同学们有什么问题,额同学有同学说老师是不是三种数据处理工具,只掌握一两个就够了。

我再给你举个例子啊,为什么circle有,so为什么要有有circle之后还要要有spark呢,其实是这样的,spark里面的RDD它可以实现复杂的操作,就是说RDD我们其实是可以实现复杂的操作。

但是SQL呢其实是没办法实现这种复杂的操作,这个就是看这个不同工具它的一个场景不一样,不同工具的场景不一样,然后嗯就是我们需要用到的工具不一样,然后你说是不是要掌握一两个结构,这个我不敢保证。

就是说你具体要掌握多少个,这个你要找的一个工作,其实也就是说你找的工作的岗位,其实也跟我们具体学的技能也是相关的,你可以假如说你想找哪个公司的岗位,你去看一下他们的岗位里面,假如说要有bug的话。

其实很有可能就需要你掌握spark,其实这种情况不是说我只掌握一两种就可以了,对嗯pandas我建议大家应该是掌握的差不多了,SQL和spark呢我建议还是掌握一下,非常容易考到啊。

这个也是常见的一些面试题,还有没有同学有问题,那么我们下节课呢就讲这些基于pandas的这种,或者说Python环境下的哦,这种高阶的机器学习的案例啊,可能在之前的过程过程中呢。

给大家讲的这种是这种简单的经济学家案例,对,还有同学有问题吗,那么我们待会会把这些所有的课件和PDF,马上就上传到我们的QQ群啊,我们今天呢就理论讲的很少啊,主要是讲一些实操啊,因为就是应该怎么练习呢。

我们我们明天的实训,明天的实训就是把我们的一个给了一个没,就是说大家的一个环境啊,就是说应该可以安装spark,你可以直接在上面,我们明天的就是明天的实训内容,就是有一个spark的很很简单的一些例子。

然后看大家掌掌没掌握这些具体的一个呃,就是说这些函数对我们有实训的一个作业嘛,对,然后其实其实有同学还是对这个斯spark,不不够重视,其实我觉得因为我们的课程安排,只安排了一节课啊,我没办法讲很多。

因为之前我讲个例子,就说我一同学在在阿里,他其实每天都是在写4spark,就是说算法工程师每天都在写4spark,其实基本上都是这样,所以你不是说不是说spark不重要啊,可能你骗被骗进去之后。

你就没办法了,对好嗯,明天的一个就是实训是spark的一个基础啊,基础的一些例子,看大家有没有掌握,还有同学有问题吗,好那么如果没有问题,我们今天的课程就到此结束了。

标签:这个,在线,一个,笔记,公开课,就是说,然后,我们,其实
From: https://www.cnblogs.com/apachecn/p/18498034

相关文章

  • 七月在线公开课笔记-十三-
    七月在线公开课笔记(十三)1447-七月在线-机器学习集训营15期-P3:02-CV-2-行人重识别项目(ReID)跑通训练+评测流程-程序员技术手札-BV1ASste6EuZ好啊,各位同学大家晚上好,嗯那今天是我们的啊,COMMDIVISION里面的第二次的这个项目课程,然后在上一节课程里面中,我们其实是跟大家已经讲......
  • Markdown语法笔记
    1.关于标题#标题1##标题2###标题3####标题4######标题5#######标题62.简单文本一个*,斜体两个*,加粗两个~,删除<u>表示下划线3键盘文本ctl+B<br>内容---><---换行4.>引用门前有两棵树--周树人--鲁迅5.有序列表6.无序列表列表1列......
  • ARM Memory(L1/L2/MMU)笔记
    《ARMArchitectureReferenceManualARMv8-A》里面有Memory层级框架图,从中可以看出L1、L2、DRAM、Disk、MMU之间的关系,以及他们在整个存储系统中扮演的角色。涉及到的相关文档有:《ARMArchitectureReferenceManualARMv8-A》:E2TheAArch32ApplicationLevelMemoryModel......
  • [Ansible实践笔记]自动化运维工具Ansible(一):初探ansible&ansible的点对点模式
    文章目录Ansible介绍核心组件任务执行方式实验前的准备更新拓展安装包仓库在ansible主机上配置ip与主机名的对应关系生成密钥对将公钥发送到被管理端,实现免密登录测试一下是否实现免密登录常用工具ansibleansible—docansible—playbook主要配置文件Ansible模块配置......
  • 程序员修炼之道——从小工到专家读书笔记2
    第四章至第六章为程序员提供了一系列实用的编码原则和实践技巧。第四章:注重实效的偏执这一章深入探讨了程序员在面对复杂性和不确定性时,如何保持一种“偏执”的态度来确保软件的质量和可靠性。程序员应该对自己的代码持怀疑态度,始终假设它可能存在错误,直到经过严格的测试和验证......
  • 2024 Fall NJU ISE 课程笔记
    友情链接:https://eaglebear2002.github.iohttps://spricoder.github.iohttps://wbl-z.github.io/1-1自动化测试目录1-2物联网目录2-1数据库目录3-1机器学习目录3-2移动互联网4-1编译原理目录4-2需求需求笔记目录5-1概率论概率论笔记......
  • SPI通讯协议笔记
    SPI的通讯时序当我的NSS从机片选线从高电平被拉至低电平代表选中了这个从机,通讯开始,当从机片选线从低电平升至高电平,代表通讯结束(选中从机状态取消)SCK每一个周期传输MOSI和MISO的一个数据,当SCK下降沿时采样MOSI和MISO的数据......
  • FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库LD
    ijkplayer是一款由B站研发的移动端国产播放器,它基于FFmpeg3.4版本,同时兼容Android和iOS两大移动操作系统。ijkplayer的源码托管地址为https://github.com/bilibili/ijkplayer,截止2024年9月15日,ijkplayer获得3.24万星标数,以及0.81万个分支数,而这还是ijkplayer停止更新6年之后的数据......
  • 新东方在线视频课程资料下载工具,如何在电脑端下载新东方在线视频课程讲义到本地?
    一.安装新东方在线课程下载器1.获取学无止下载器https://www.xuewuzhi.cn/koolearn_downloader2.下载安装后,然后点击桌面快捷方式运行即可。注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。二.使用说明1.学无止下载器介......
  • 关于项目引用onlyoffice作为在线office文件预览与编辑的笔记(二)
    基于上一篇中已经创建了onlyoffice容器,所以该篇讲述如何升级容器配置1.修改onlyoffice20并发限制方案一进入容器修改六个app.js文件find./-nameapp.js目录下所有app.js文件,对代码行进行修改,只是经过简单的测试,希望发现问题及时回复。(this._state.licenseType=e),/......