00:00
写代码之前,那首先大家还是熟悉一下这个,呃,在这个猪皮特notbook里边,这玩意儿怎么用啊,大家会看到这里边是不是可以去new,可以去拗一个文件,是不是还可以拗一个folder啊,那我直接放在桌面上可能觉得不舒服,那我可以这样啊,我去拗一个folder,那大家看这里边是不是有一个untitled的fo folder,我这里稍微有点乱啊,那我是不是可以把它做一个rename对吧?比方说我这个rename就叫Python吧,好,那接下来大家看我一点是不是可以进入到这个目录来,接下来我是不是可以创建一个PYTHON3的程序,大家会看啊,它就会打开一个这样的页面。那在这个页面里面,大家看这可以干嘛呢?呃,大家一看这是不是就是相当于就跟我们的那个命令行一样,你直接可以去写代码,它能写什么代码,比方说啊,我们直接啊A等于三,我shift加enter,这就直接是可以执行这一行代码,或者大家也可以点这里是不是有运行啊,对吧,可以运行这个代码,然后我再敲一个A,大家看A是不是就是三对吧,然后BA好随便给一个啊加B是不是就是这样啊,所以大家看这是不是就是一个所见即所得,或者说就是大家一个更好使的一个呃命令行程序,或者说大家可以认为为什么叫notebook呢?对,是不是就是这样一个笔记本程序啊,所以我们想写什么代码,随时就可以看到它的演示效果,这是不是就比,呃,为什么我们要用Python,就一方面机器学习的库,Python有很多机器学习的库,这个大家应该。
01:41
知道对吧,有很多这个机器学习的算法啊,这个机器学习的这个工作其实跟Python相关的,要要会Python,另外一方面就是确实它方便这个用起来我们随便去敲一敲就那当然大家大家习惯是不是学一个东西的时候,首先得按照程序员的标准先打个招呼是不是对吧?对,所以是不是就这样啊,直接去执行是不是就可以了,当然如果你这里边不想要这些东西的话,这里是不是有一个这个剪剪剪刀啊,我是不是直接可以把它都删掉,哎,这个就就非常的简单啊,好,这个大家就熟悉一下这个操作就可以了,这个这个对大家来讲我觉得没有什么难度,接下来重点就是我们要开始真正的马代码了。
02:27
好,那我先给一个大家看啊,我先给一个标题,这个叫简单线性回归,而且大家会回归啊。回归。而且我们这个应该是最小二乘法对不对。最小二乘法啊,大家看我这还可以做一些别的操作啊,现在它默认我这是不是都是代码啊,我可以改它的类型。我可以把它改成标题,或者可以把它改改成标记,比方说我这里改成标记,大家看这是个什么东西啊,这是个markdown对不对?我一执行大家在很多网页上或者github,大家用过github的话,写过那个github里面的markdown文件的话,对吧?一开始的那个read me是不是都是这样的形式啊,是不是都长这个样子,他就用这样的markdown语法来写的啊,所以这里稍带给大家介绍一下啊,这个就看起来就像一个正经的一个教程啊,对不对?好,简单线性回归,那接下来我们的呃目标是什么呢?呃,就是要用这个最小二乘法来求解对吧?好,那接下来我定义一下啊,大家会想到我一开始的第一步应该先做什么事情啊,是不是先要引入依赖是不是?呃,正常来讲的话,写代码的时候肯定都是这样的一个流程,我还是把它设成标记三个井号,大家看这个字体是不是就变小了。
03:57
对吧,这这个还是比较简单的一些语法啊,好,接下来我们该引入的是不是要引入这里边既然是做计算,那数值计算安派是不是肯定要啊?呃,大家学过Python的话,它的这个引入语法其实跟scla Java其实也还是有一点像的,但是稍微有点区别,对不对啊,它是importt什么,As什么对吧?呃,大家可以看到啊,或者是importt什么,From什么importt什么,所以我们这里这这里这个and是不是就是重命名啊,之后在调用的时候不用nonepi,直接用NP是不是就可以了?好,然后我们再引入一个画图的程序,我们想看图像啊,Matlo lab,那我们直接引入它的py plot py plot as plt啊,我们把这两个先引入,诶,写错了是吧?这里写错了啊,大家看。
04:57
Py plot,嗯,MAT plot lab写错了啊,好,接下来我们要做的继续啊,接下来大家觉得我该做什么了,引入依赖,大家想啊,接下来你就写程序呗,写程序也得有步骤啊,对吧?呃,第一步大家想到的是什么?我们要写一个线性回归的一个这样的一个机器学习程序,机器学习我们首先得有什么来着啊对,大家想到我们首先是不是得有数据源啊,那我们现在连数据还没有呢啊,这里边我给大家一个数据啊,这个数据。
05:40
一个叫做data csv的一个数据,我们先打开看一眼,它是个什么东西啊?诶,大家会看到它里面是什么数据呢?很多组数据,很很多个,对不对,这个数据就是大家看逗号隔开的两个数,那大家能想到这是什么呀?是不是又是坐标X跟Y啊,哎,我们是不是就是把前面这个当成X,后面这个当成Y,最后是不是可以去拟合一个直线啊,我们把点画出来,看看那一条直线能不能拟合它对不对,而且这里我可以告诉大家,这个本身是这个数据是有一些实际意义的啊,它代表什么呢?前边的这个X第一个数代表。
06:23
啊,这就是学生在去学习的时候,学习的时间,或者说我们机器学习的时候学习的时间,然后后边这个代表什么呢?代表他的评估的分数,考试成绩对不对啊,所以大家会看到啊,这其实就是说,诶,你是不是学的时间越长,考的分数就越高呢?呃,大家会想到直观来想的话,差不多按道理是你应该学的时间越长,应该是有一个正相关的,对不对,学的时间越长,考试成绩就越好,但是其实也不完全一定,对不对,那我们现在如果要用一条直线去拟合的话,那相当于就是要拟合出来,诶看看是不是啊,大概的点能够放在上面对不对?好,然后接下来,呃,那大家会想到我们这个是不是应该有一个什么要求啊,大家会想到有一个什么要求呢?我们是不是得把它放到,大家看我在这个Python目录下面是不是有有了这样一个一个文件文件文件,那个刚才就是我们创建好的这个notebook Python程序文件对不对,我们还没有命名,所以叫untitled的,对吧?我们要引用它的话,我可以直接把它拿过来,那拿过来的话,我是不是引用的时候就不用再加目录了呀,啊就会简单一点,要要不然我还得加目录啊,我把这个删掉。
07:46
好,有了这个之后,大家其实可以在这里多看一眼,看这里是不是多了一个data对吧?好,那接下来我们要做的就是导入数据,我们的数据是什么呢?是不是data.csv啊好,接下来呃,大家会想到我,那我们这个导入数据是用什么方法导呢?呃,大家可能知道这个既然讲过Python,那肯定知道Python里边我们定义变量不需要提前,就是就给它定义出来,声明它的数据类型,对吧,就随随时用对不对?所以这个其实大家写的会比较比较简单,那我们就是把这个导入的数据把它保存在哪里,把它叫做points吧,就是我们的数据样本点对不对,X y points,那points等于我们调用NP,下面有。
08:47
一个方法叫做呃,叫JA from txt,也就generate from txt对不对,这是从这个可以从一个文件里边去引入数据CSV啊,那后边还可以去指定定,比方说来看啊,这个deimter是什么意思,对,是不是分隔符啊啊但当然这个Python里边大家知道这个就是单引号双引号都可以啊,我们要是风格一致的话,可以都用一种。
09:19
好,那么这个如果要是引入的话,我们我们先可以看一眼啊,引入进来是什么东西,Points,大家看引入进来是不是就是这样的一串东西啊。大家看它的数据类型是什么呢?对,它是一个ARA,那这是相当于是na派里边定义好的一个数据类型了,对不对?呃,P Python本身是不是没有定义过这个类型啊,对吧?那么看这个AR ray,它里边又是什么呢?这其实就是一个二维数组对不对?大家看二维数组对吧?然后它有本身它有多少个数据,是不是这里第一个维度就有多少个啊,然后第二个维度是不是就是每一行,或者说每一条数据是不是有两个维度X跟Y对不对?所以大家看这里边的这个二维数组其实是不是就相当于是一个矩阵啊,大家想一想它为什么写成这样的一个形式,这是不是就是一个矩阵,那这里就是一行对不对?然后这里就是列,所以这其实就是我们的一个矩阵,接下来我们的操作,大家把它当成一个矩阵来操作就可以。
10:29
好,那已经有了这个POS之后,接下来我们是不是得把这个我们要的是不是得根据这个X跟Y的关系去做拟合啊,所以我们是不是得把XY单独提取出来,好,所以这里边我们提取呃,Point中的两列数据分别作为X和Y,对吧?那么大家看一眼,X应该等于什么?Points里边应该拿对不对?但注意这里边我们要拿什么啊,我们是不是要拿它有的所有行的第一列对不对?哎,这个就有点麻烦,那这个这个怎么去操作呢?那我在这里先给大家看一看这个怎么操作啊,大家会想到这个points它既然是个数组嘛,那我是不是可以直接去这么取啊对吧?那POINTS0大家看到拿出来是什么?是不是就是第一行数据啊,那如果我要是POINT00,哎哟,是不是就是第一行数据的横坐标X啊,大家看在这个number派里边,它有一个简单的写法,它可以这么去写,就是后边两个坐标,它可以直接逗号分割这么去写,对吧?那这个零零,这是不是相当于我们矩阵里边的零零坐标啊?呃,就是相当于第一行第一列那个。
11:59
元素对不对,这里边从零开始的话,第零行第零列那个元素,所以这样写的话,就跟矩阵的写法是非常直观的,非常一致的,那我们现在拿出来的这是第一行第一列,那我们要找所有行的第一列怎么取呢?大家还记得Python里边它有一个那个索引,它有一个什么样的方式吗?
12:24
提取所有的东西,它有一个什么样的方式呢?大家还记不记得我是不是当时有一个这样的方式。这是不是就像JS里边做字符串截取一样的那个那个方式啊,对吧,就可以做分片对不对啊,当然我这里边如果是零到一的话,它是不是它是前闭后开对吧,就是零包括但是不包括一,所以如果我们零到二的话,是不是大家看截取出来就是两个了,那我们现在如果要想要拿它所有的第一列怎么拿呢?
13:02
零所有道是不是应该是所有的啊啊,那当然了,这里边所有的它有一个非常简单的写法,这里如果是零到二的话,我们其实是不是就是就是要拿所有的了,它是不是后边可以省略啊,后边省略是不是就表示从零开始,然后所有的都拿对吧?甚至你前面是不是也可以省略,前面省略是不是就表示从头开始全拿啊啊大家回忆一下啊,这是就是Python本身的那个list列表里边的一些这个这个分片操作啊,之前是不是没讲过,应该讲过,是不是可能大家只讲过一天,所以说没没太多印象啊,回忆一下就好,因为这个还是很好理解的,对不对啊,就是就是这样啊,就是一个冒号,就代表这个所有的好,那么所以接下来我们这里X要取的是第一列,那应该怎么取呢?对,是不是就变成了冒号?
14:02
零啊,哎,这就表示第一列对吧?好,Y等于冒是什么?呃,YY是什么?零到冒号呢?零到冒号,刚才我们取出来是不是第一行了,一冒号,那应该是什么?那是不是变成第二行了?对,是冒号一,对不对,冒号零是第一列,然后冒号一是不是就是第二列啊好,大家还是熟悉一下我们这个,那大家看一眼现在的X是什么?是不是变成这样的一个一维数组了呀,或者说这变成了一个向量了,对不对?那大家看这里边每一个元素是不是其实是之前points里边的横坐标啊啊,大家看一眼啊,就是32 53 61 47,好,我们看一眼point 32 53 61 47是不是就是这个啊啊,所以大家可以校验一下这个东西到底是什么。
15:02
好,那接下来我们用就是ma lab,它里边的这个polo来做图了,对吧?我们用它来画出散点图,我们先看一下它本身这个数据长什么样,好,那么这个调用之前大家可能没用过,但是它非常简单,所以我们就直接写就可以了。plt它里面有一个方法叫scatter scatter什么大家知道吗?散点的意思就是散点的意思,所以里边是不是就是XY对吧?你既然要画散点图嘛,是不是一个应该有横坐标,有纵坐标啊,XY传进去完事,然后plt点数是不是画出来啊,看一眼大家看就就长这个样子。所以这个是不是特别好使啊,对吧?呃,对,直接直接就能看到它这个到底长什么样,所以我们直观的来看的话,大概其实还是有一个就是斜向上的这个规律的,对不对,所以其实用一一条直线来拟合,其实还是有道理的,但是大家可以发现其实不是绝对的,对不对,不是说你学的时间越长就一定得分越高,对不对,像人家这里这个点是不是学的时间不是最长,但是人家得分最高,呃,这个就因人而异了,对不对?但是整体这个规律来看的话,那就是你花的功夫越少,那就得分越低,花的功夫越多,时间越长,是不是得分就越高啊啊,所以这个也是一样的,大家从自己的经验也能总结出来,我们已经学了六个多月,那肯定大家花了这么长时间一定会有收获,对不对啊,所以这其实就是很符合我们直觉的一个一个样子啊好,那接下来大家会想到我们已经有了基本的数据,接下来是不是就是要实现算法了。
16:54
在实现算法之前,我们先定义一个东西,我们先定义什么呢?我们做机器学习做这样的最小二乘,我们是不是需要有一个目标函数,损失函数啊,我们其实想看到你最后到底损失了多少对不对?好我们先定义一下啊,做机器学习的算法先定义损失函数,好,那么这样一个损失函数怎么去?
17:23
还是自己小一点啊,这样一个损失函数怎么去定义呢?那这就是Python里面的函数了,它会DeFine对吧?这这个大家都知道的吧?好,我们定义一个函数名字啊,计算损失函数,比方说就叫compute cost吧,计算损失函数的时候,我们要传什么东西呢?损失函数跟什么东西有关啊?损失函数是系数的函数,对吧,所以我们这里是不是要传输它系数啊好。我们定义一下啊,损失函数式系数的函数,另外还要传什么?大家想一下,光有系数我直接就能算了吗?我们这里的数据这个如果只是一条直线,一个横坐标的话,是不是就是WX加B,就是W跟B2个数对不对?你传进去就能算损失函数了吗?还得有数据对不对?哎,所以另外另外还要传入数据的XY对不对?你还要把这个数据要传进去,那我们这里不用传XY,我们直接把POS传进去,是不是也一样啊啊,我们这里就直接传points啊。
18:40
那这里的写法就是是不是应该把WB这是我们的参数对不对,最后是不是还有point啊,当然我们XY都已经拿出来,你单独传也可以啊好,接下来Python里边的函数写法是不是后边它代码块是这个冒号分割啊对吧,后面是冒号,然后接下来就是用缩进的方式去区分代码块了,大家想一下这个损失函数怎么定义啊。
19:06
失函数怎么定义,损失函数是是不是就应该是这个东西啊,大家想一下对吧?当然这里是我们定义出来本身是不是按照我们之前的定义,损失函数应该还得求一个平均数啊,只不过我们是下面求这个最小最小值的时候,导数等于零,你前面乘M分之一不乘M分之一是不是一点区别没有啊,要等于零之后是不是那个系数都都消掉了对吧?都没关系了,所以这里我们就没有去把它写出来,规范化的写法,是不是还应该最后再除以M啊对,就是平方损失函数,最后均方误差,最后求一个平均数,好,那么我们这里边的要去算均方误差的话,是不是得有一个M,然后得有一个这个误差值啊呃,得有一个总共的求和的这个误差哈,好,那么大家想到我是不是先得定义一个total cos的这个这个变量对吧,那它这个要求和大家想到是不是接下来得有一个for循。
20:06
啊,那我们一开始是不是应该让它等于零对吧?接下来是不是还应该有我们那个MM是什么,M是不是就是POS的个数啊,所以我们是不是可以直接Python里面是不是有一个lengths这个LA这个这个方法啊,可以直接求一个一个list列表的一个长度对不对啊,所以直接length points好,那这是不是就拿到了我们当前想要的最主要的两个数据对不对?接下来是不是就是一个for循环就搞定了对吧?这里边要做的是呃,主点计算损失误差。然后求呃,误差的平方对不对,平方损失误差平方,然后求平均数,好,那么我们这里面for的话就for I in in什么呢?对,一般这个在Python里边是不是range啊,对吧?这就相当于是便利了一个一个列表对不对?这个得到的是一个列表啊,认准M,这就可以变历了,那大家会想到每一个点我们是不是都得拿到它的那个值啊,那我们是不是得把XY分别拿到,这里边的X应该是什么?
21:35
Points里边拿对不对?Points的什么?对第二行第一列是不是零啊,对,所以这是X,所以Y是point,第二行对第一列,这就是X和Y。好,接下来是不是很简单,就是coco cost加等于对不对?算误差了,每一次都要叠加对不对?误差怎么算呢?是不是这个公式啊,Yi减去w Xi减B,然后再平方对不对?哎,这照着抄就可以了,大家看一下这个Y是什么,是不是就是Y啊?哎,但是已经在循环里面,就是Y减去WW是不是传进来的呀?乘以XX是不是就是前面提到的X啊?
22:28
后边是不是还要再减个B啊,诶B也传进来了,哎,大家看这个公式不是完全一样,后边平方大家知道在Python里面是不是平方,这个次幂是不是可以用这种方式来写啊,对吧?对两个乘号两个心是不是代表乘方,大家看这是不是照着这个公式完全抄下来了,就这么算好,那么这个求和求完了之后。好,是不是取平均返回就可以了,哎,那我们不用再算了,是不是直接返回就完事了,偷偷cost就呃,大家想一下,这个扣扣套cost是不是除以一个M直接返回就可以了啊,有同学可能细心的话会想到,诶,这个你除完了之后,它是一个什么数据类型的,直接返回靠谱吗?
23:20
Python不太一样,Python的除法你一除的话,是不是直接就是一个浮点型啊,M即使是total cost和M都是整形,最后是不是也是一个浮点,这个大家知道的是吧?多写一句啊,比方说一除以三是不是输数就是一个浮点型啊啊这个大家随时去做校验啊,那如果说要想拿到一个整形的话,怎么去拿呢?是不是它有一个这个两个除号,是不是叫地板橱啊,对吧?对,为什么叫地板除,它向下取整,那个是不是叫叫floor啊,对,Floor除法啊,Floor d divide,所以有时候就叫成地板除向下取整是不是取了一个零了,所以大家熟悉一下这个,再回顾一下Python里边的这些基本的用法啊什么啊,当然就是大家可能还考虑到,就是这个东西要保留几位,我们这里边其实不重要对不对,我们精度只要它是一个浮点型,有基本的。
24:20
温度就可以了,对于我们这个算法而言不重要,大家如果要是想去保留的话,也可以去设置一些精度在Python里边,其实不需要去去弄那么多的,我们都是直接拿来用就可以了,好,那这个损失函数就已经定义好了。
我来说两句