七月在线公开课笔记(十四)
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