00:00
新建一个。Notebook教程啊,在这里边我们这个叫做k means聚类教程啊,直接说教程吧,K就代表K均值聚类对吧?标记呃,这个大家其实可以想到,就是一开始我们是不是还是先引入依赖啊对吧。我们这里面的依赖,其实大家能想到,一开始还是是不是na派肯定要啊SNP,然后大家会想到,呃,在这个里边。我们这里边是不是有很多个点啊,那这个是不是也应该得画图,我看一看它的效果,对,所以我们把这个画图,那个叫什么来着?Ma plot lab对吧?要引入它里边的py plot,对,我们一般把它叫做plt,对吧?然后这里边大家还会想到,那我除了依赖之外,是不是还得有数据啊,我们的数据从哪来呢?哎,这里边我们还是直接引入一个包里边的数据来用就可以了,现成的数据用什么东西呢?用SK learn里边,这回我们用的不是现成数据,而是用了它data sets这个类里边的一个sample the generator generator这样一个类,它里面有一个方法叫做。
01:45
Make blocks啊,所以这个其实就是可以直接生成,就是按照一一定的聚类标准生成的一组数据,等一下我们看一下它长什么样就可以了啊,大家只要知道这是一个呃,SK learn里边的方法就可以SK learn呃,我们把这个。
02:09
好,我就说SK中吧,直接生成类数据。好,这是首先,诶,哪里写错了,看一眼啊,Import from port对吧,好。接下来大家会想到按照我们的一般的这个流程,是不是把数据加载进来啊,对吧?数据加载和处理这个过程当中,我们加载当然就是直接用makelos对不对?大家看,我可以直接定义一个X跟Y,它等于make blos里面要给参数,什么参数呢?呃,第一个参数大家看啊,叫n samples,大家能想到这个N打头,这代表什么意思,比方说我们给100啊,N打头是不是代表个数啊,哎,所以n samples这是样本点的个数,所以我们生成100个样本点对吧?好,然后接下来。
03:32
Centers,我们给他六个,这是不是六个中心点啊,所以它是不是就按照六个中心点直接生成对应的聚类数据啊,啊,所以我们最后如果聚类能把它聚回到原先的这个六个中心点,这就没问题对不对?好,那么然后接下来当然就是还应该随机对不对?Random state给一个种子,比方说随便给吧,1234吧,然后cluster,这里还有一个标准的聚类,就是聚类的一个标准差对吧,就是说我们随机分布它的时候,你到底偏差有多大啊,这也是一个参数啊,这里我给一个0.6啊,大家可以随便去调这些参数。
04:18
然后这个时候大家就可以看一眼啊,这个X得到是什么呢?大家看X就是这样的一个一个矩阵对不对,这个矩阵大家其实已经习惯了,矩阵里边是不是一行就是一条数据啊,然后这么多行是不是就是这大大家想到我们应该是大概是多少多少行啊对,100个点是不是应该是100行啊对,大家可以看一下它shift是不是一百二啊,100乘二对不对,那么每一行是一个数据,呃,数据的样本点,它就代表它的两两倍的坐标对不对,一个横坐标,一个纵坐标,诶,那大家会想到它有Y呢呀,Y是什么东西啊,我们看一眼Y是什么。
05:05
大家看一眼这个Y它的取值是什么呀?012345,它是不是代表它的类别啊,对,因为我们前面要求他按照中心点生成六类对不对,按照六个中心点生成,所以它默认生生成出来的它类别就已经在这里了,当然了,在我们这个,呃,就是应用里边这个Y是不是其实没什么用啊,大家想。因为我们之后是不是对于我们这个聚类来说,我们是不需要它一开始有Y的,对不对,我们只要X,最后我们要自己把它聚出来,对不对啊,当然这个这个Y就是对大家而言做一个参考就可以啊,我们可以不关心它,好所以这一部分我们就直接知道X就可以了,那接下来我们其实是不是可以做个图把它画出来啊,诶plt啊呃,这是不是散点图啊,Scatter,然后大家会想到scatter里边是不是要指定本身画点的那个坐标XYX跟Y啊,那这个XY是什么呢?
06:18
它的XY是不是都是X里边的值啊,是X的第一列,是不是我们想到的那个X对不对?横坐标X的第二列是不是我们的纵坐标那个值啊,所以这里边我们怎么给呢?X的横坐标怎么给啊?中括号对,是不是冒号零,这是不是表示它的第一列?哎,之前我们干过这种事情啊,后边是不是冒号一第二列啊。啊,然后我们这里边Y也可以画图的时候有一个用途,比方说大家还记得C是代表color对吧,我可以C等于Y,可以这么干手,大家看这就是我们画出来的这个样本点,呃,大家看它,它预先这100个样本点就聚成了这么六类,对不对?我如果C等于Y的话,是不是Y取不同的值的话,它就会有不同的颜色显示啊啊,当然这个就是看起来漂亮一点而已,对我们没有什么任,就是没有太太大的意义,对不对,我们最后是要自动给它做聚类的啊,当然大家如果看着这个图有点扁,这个点都看不太清楚的话,我们前面加一个设置啊,可以加一个什么设置呢?对,大小figure可以定义一个figure size size啊等于呃,比方说我们定义一个六。
07:47
六这样一个正方形,哎,大家看这样看起来就稍微舒服一点,对不对,好,这是我们就把这个数据加载进来,而且把样本点全部画出来,散点图接下来。
08:02
我们就要进行算法实现了,对吧?算法实现呃,这里给大家的这个大家对应这个KNN这里我们是不是会想到king里边也要计算距离啊,那我们是不是也得先就是定义距离函数啊,这个里边我们就就简单一些啊,就就不用那个像KN那边主要是给大家说我们可以有不同的距离函数,这里边我们就简单了,简单一点我们直接还是调库吧,对吧?啊,这个肯定这些东西在现成的库里边都有,对不对,在什么库里边有呢?呃,就是三派special这个里边它有。Distance from,它我们import一个什么方法呢?这个类里边有一个叫做CD的一个方法,它就是计算欧式距离啊,就是它可以计算各种各样的距离,默认就是计算欧式距离对吧,那我们这里面就计算欧式距离就可以了,这里给大家注释一下引入诶。
09:18
三派中的距离函数,默认欧式距离,好呃,当然这个三派大家会看到我们前面讲那个派star安装这些类库的时候,安装包的时候没有把它安装进去,它是我们在装SK learn的时候,这个它是相关的一个依赖,自动就会装上,所以如果我们装了机器学习的那个库啊,SK learn它自己就已经有了,大家如果是anaconda的话,就是也不用专门装,就是本身这个都已经有了,好,那接下来我们是不是学着这个KN这一块也去定义,可以定义一个类啊,对吧,它本身比较简单,我们用比较复杂的这种写的形式啊,K means。
10:08
他要继承一个object对不对?好,那接下来第一步是不是应该初始化,初始化大家想一下初始化需要什么参数。首先k means是不是参数应该有一个K啊啊,我们这里边就还是叫N吧,呃,我们叫一个N,明确一点啊,N cluster就是聚类的类别n cluster,然后这是它的括括一个啊,这个就就就是我们所认为的这个K对不对,然后大家想到还需要什么东西呢。我们这是一个迭代法,我们前面说迭代结束以什么为标准呢?一般是不再更新,或者是到达上限,对吧,给一个次数,那我们这里就简单的,我们就不用说它不用更新了,就直接给它按照一个上限迭代完就完了,对不对?Maxer,然后大家想到还应该有什么参数呢?还需要什么。
11:20
我们在做这个聚类的时候。啊对,大家有有同学想到了非常好啊,是不是应该有一个初始点啊,哎,你初始这个执行点是不是应该确实是应该去指定一个对不对,如果当然我们程序里边可能去去实现,就是你不指定的话,我随机选一个对吧?啊所以这个大家也应该想到,这里是需要有一个初始至新的这个迭代次数。然后初始智新,呃,智新这个名字叫3CHOICE,好,那么我们就可以定义这样的一个in函数方法,它里面的参数第一个是不是self啊,第二个就是我们定义好的n clusterus,当然其实这个我们已经知道了,所以我们可以给它一个默认值,就是六对不对,大家已经看这个图上已经能看出来,它肯定就是六类,所以说这个就呃,没什么,没什么问题啊,当然我们也可以据不同的类,大家看一看到底效果怎么样,MAX1特,我给一个给个300字吧,然后3CHOICE。
12:48
这个默认是空对吧,先给一个这样的一个定义,那么进入到这里来啊,大家其实会想到是不是要有一堆这个,这个就比较麻烦啊,要有一堆的这个属性的定义,对不对,把我们传进来的参数放进来,self.max等于maxer self点。
13:15
3CHOICE,这里大家注意3CHOICE,如果说这里边传进来的,大家看这个样子是有点像一个数组对不对?所以我们这里边还要对它做一个数据类型的转换,转换成啊南派里面的那个矩阵对不对?NPR把它s choice传进来,那后边当然还可以指定它的数据类型啊,数据类型是低type对不对?这里我们可以指定一个float。呃,这是这样的一个初始化的过程。然后接下来大家会想到第二个方法,我们应该去实现一个什么方法呢?是不是会有一个fit啊,我们一般训练模型是不是都用这个fit方法,然后后面会有一个预测predict方法对不对啊,这个机器学习里面经常都是这样的,那这里边的训练模型的过程。
14:17
训练模型方法啊,大家会想到它应该传什么呢?这也就是k means聚类过程对不对,这是不是要把数据传进去,它直接就应该开始聚类了呀,这是不是就是我们的模型训练的过程,最后预测应该是聚类,聚好了之后来一个新的点,我告诉你它分到哪一类对不对啊,这是我们的一个想法,那大家想想这个需要什么参数啊。需要什么参数,是不是就是需要我们的数据样本点啊,对吧,把原始数据传入,传入原始数据,那这个原始数据对于我们而言是什么呀。
15:07
前面我们定义好的是不是就是X啊,Y不要传对不对啊,我们只要XX本身就是一个啊,一个点就是两个坐标对不对,它本身就是有两个值的,好,那么我们这里边传入的东西叫data吧,啊,大家注意啊,在这个类里边第一个参数是不是必须是self啊,然后第二个是data对吧?接下来大家会想到了,我们首先是不是还是考虑一下,假如没有指定初始至心。那怎么办呢?是不是我们随机生成一个呀,就。随机选取,我们这里随机选取。Data中的点作为初始之心啊,这是我们想要先做的一步啊,那所以当然假如没有麻纹,那我们先判断一下对不对啊,这里边判断大家可以用LS,也可以用这里边的shape来判断对不对,我们是不是要判断choices。
16:23
它的ship是什么,对不对?那么他假如说我们现在没有这个ship的话,它会是一个什么样的状态呢?它会是一个零航的这样的一个矩阵啊,大家可以看一看这个这个操作啊,等一下大家也可以自己去试验一下,看看是不是这个样子好,那么呃,但大家可以知道它什么意思就可以了啊,不需要太纠结于这个写法,我们也可以用LS去做,对不对。那么如果说它没有的话,我们是不是要给它赋一个值啊,负一个什么值呢?我们是不是应该从data里边去选取啊,大家想一想,按照我们的这个要求,是不是随机选data里边的点,那我是不是应该是从data里边随机找到几个值,那大家会想到我这里边肯定要有随机,那我是不是随机生成一个。
17:23
它的那个索引值是不是就可以了呀,我按照这个索引值,按照它的下标去找对应的元素取出来就可以了,对吧?所以我这里边其实是它的下标要有一个啊,随机生成的一个索引,但大家会注意data本来是一个矩阵二维数组对不对,我们生成的下标应该是它的第,就是随机的这个下标应该是它的第几个维度啊。一个第一个对应该是它的第一个维度对不对?第二个维度呢,我们是要第二个维度就是列对不对,我们是要第一列还是第二列还是全要对,我们生成这个随机的索引之后,这个点是不是全要啊,哎,所以它的既然是一个点嘛,两个坐标是不是缺一不可,所以说我们全要,那我们最后的这个表示是不是应该是前边随机生成,后边是不是应该是冒号啊,哎,所以这是我们想要的这样的一个状态,对吧?那现在就是前面这一部分要随机生成了,随机生成我们调用什么方法呢?当然就是有random方法,对吧?啊,这里给大家写一下啊,就是呃,Number派里边的random这个这是一个类,它里边有一个方法叫re int,那大家会想到这是不是随机生成一个整数啊,一个整形的变量对不对,那大家会。
18:52
看到里边肯定它有参数,什么参数呢?从几到几对不对,我们生成的是从几到几啊。从零到哦,大家会想到我是不是应该从零到这个得塔的行数啊啊得塔的行数怎么写呢?啊,当然大家可以可以取那个data的lengths对不对?或者我们这里如果用shift的方法的话,也可以直接是不是SHIP0也可以拿出来啊大大我们前面看这个的时候,是不是也是就直接用这个ship啊,SHIP0就是前面这个行数对不对?哎,这就是从这个零到它的行数,后边还可以有一个参数是什么呢?
19:40
是不是你生成几个对吧,你到底要生成几个,我们要生成几个,对,我们要我们要生成六个,但是这里如果按照这个这个类的这个标准去写的话,归一化去写的话,我们不能直接写六,我们这里应该叫什么啊,是不是叫self.n clusters啊对,这里是六个啊,所以尽管看着这个很长一串,但是大家知道前面这就是一个随机选取对不对?选取一组后边是不是都要啊,大家只要知道这个含义就可以了,好,我这里还是给大家注释一下啊,从data中随机生成零到行数的。
20:31
六个整数作为索引值对吧?好,呃,那已经有了我们初始的执行点的话,接下来是不是就可以开始迭代了?好,那么开始迭代啊。那一说迭代,大家知道是不是上来一个for啊,For I in range,这个应该应什么啊,对,是不是迭代的上限对不对,self.max然后我们看一下这个循环里边怎么去做,这个循环里边我们又分几步呢?
21:19
这里边其实大家会想到我们最核心的是不是是不是就是计算距离对不对,然后然后是不是要把类别标成这个质心所对应的这个类别啊对吧,先计算距离,然后把类别标成质心所对应的那个,呃,就是。对应的那个类别的那个编号,然后最后是不是kin求均值啊,把所有的这个质心重新算一遍对不对,然后一遍一遍for循环迭代就可以了,所以我们要实现的这里是两步,我们可以拆成三步对不对?第一步是不是先算距离,第二步是不是把距离,呃,这个做一个排序对吧?然后大家会想到我要找到离得最近的那个距离对不对。
22:07
这个其实跟之前那KN很像,对吧,然后接下来最后一步是不是重新计算这个均值啊,计算之心好,那么我们这里我先写出这个注释啊,就第一步计算距离矩阵好第二步。按照呃对距离按由近到远排序,选取最近的至心点的类别作为当前点的。
23:02
分分类对吧?啊,这就是他的这个分类标签,然后第三步大家会想到,呃,这是不是要对。每一类数据,呃,是不是要进行均值计算啊,求均值对不对?更新质心点坐标,好,这就是我们核心的三步啊,那我们现在先看一下这个计算距离怎么算呢?当然我们这里可以定义一个distances,它就应该等于我们是不是直接可以调库了,定义好了CD对不对?前面已经引入了这个CD啊,那么这个CD有一个好处,它是什么呢?我们之前自己定义的KN里面自己定义的是。传入的是两个矩阵,但是要求是不是后面那个矩阵必须得是一维啊,对吧,或者说后面那个矩阵啊,必须得是,呃,就是跟跟他这个维度必须是得有一定的特殊要求,对吧?我们这里边CD对于这个矩阵就是只要它是。
24:16
同维度就可以不需要一定要求它必须是一行,所以大家就会想到这里我是不是就可以把。我是不是可以把所有的样本点跟六个质星同时都都把它距离算出来啊,是不是可以这么算了,不需要一个一个执行去算了,对吧?啊,那大家想到如果要是一个一个算的话,那你还得写一个for循环,我们这里边就是直接一下把六个都算出来,那大家想到我传进来的矩阵是什么呢?是不是首先要有样本点啊,样本点是不是data fate传进来的data对吧?然后后边是不是就是我们的对self点3CHOICE执行点对吧?直接传进来,那大家会想到这里得到的这个距离矩阵是一个什么样的矩阵呢?
25:10
我们现在的样本点是100个对不对,然后这里是一个六个啊对,得到的是一个100乘六的矩阵,那么大家会想一下,这个矩阵100乘六它代表的含义是什么呢?每一行代表什么呢?对,每一行就代表我们的一个样本点,它跟所有质心的距离对不对?然后这一行里边又有六个值,然后每一个值就是到对应的第几个质心的距离对不对?哎,所以那大家会想到了,接下来我们是不是按距离要排序啊,那排序我们是怎么排,是不是每一行各排各的呀?大家想每一行是不是就是一个执行点的数据,我们没有必要把把每。
26:11
就是这个点跟其他点就混在一起排对不对,只要排他自己离哪个执行点近就可以了,所以接下来大家会想到我们这里是不是最后还是要拿到一个。大家会想到最后是不是排序之后我们还是不关心那个距离值到底是多少,我们是不是还是要拿到那个下标啊,那个下标才代表它到底属于哪一类对不对?好,所以我们这里面定义一个叫c index吧,C in的,那么大家会想到这是不是要去取一个最小值啊,排序之后的最小,其实这就不用排序了。因为我们只取最近的对不对,就不用salt了,那不是,是不是直接阿命取出最小的就完事了,好,那么阿个命我们取谁的最小值呢?Distances里边的最小值,大家注意,这是一个距离,你如果直接阿G命它的最小值的话,是不是就是所有的都取出来了,我现在是只对它里边的每一行去取一个最小值对不对?最后取完了之后,大家想100乘六的这个矩阵取完了之后我要的是一个什么结果啊,是不是100乘一的一列啊,就是每一行你取一个最小值给我放这就可以了,对不对?所以我们这里有一个操作是什么?是不是可以指定access等于一,是不是最后就是保留一一列啊,对吧?啊,得到这个它的类别索引保保存在这里,好,那呃,做完这一步之后,大家就会想到,接下来我们就是对每一类数据要去更新之。
27:51
顶点坐标了对吧?呃呃,这这里这个,呃,我们这里因为这个还没做完,所以运行会有错误,我们先把这个写完啊,大家如果要是对这些还不知道什么情况的话,等一下我们还是做一个简单的测试,然后这里大家会发现我们这里要对每一类数据都进行均值计算,对不对啊,这个就稍微麻烦一点,那我们这里就可能直接一行搞定的话,会有点复杂,或者说我们还是需要有一个for循环去便利一下的,对不对?那大家想到我便利什么呢?是不是要便利每一类啊,对,所以range什么呢?是不是self.n clusters有几类我就遍利几次,对不对,遍利每一类,呃,那这里会想到,呃,我接下来是不是要考察C的,这是一个前面已经排好的那个类别的数据,对不对。
28:51
诶,他们分别属于哪一类,都已经排好了,我现在是不是要根据这个C印的这里边它属于哪一类,然后就把它对应的那个data塔值,那是它的坐标对不对?所有这一类里边的得塔值是不是要求一个均值啊哦,这个计算大家看一下我这里边做了一个什么操作,我首先判断,如果I在cin的里边的话。
29:24
大家会想到这个I是不是我们这里边的这个self n cluster,这就是零到零到五对不对啊,零到六就是0123456个取值,对吧,然后如果说他在我们的这个里边,我们就去做计算,这什么意思呢?啊,就假如说这个I就没有任何一个聚类聚到,就是我们前面取那个最近的对吧,假如说我们那个质星有一个质星,就是所有的点离他都都不最近,就是所有的点算最近的一个智星的时候,都没有回到它,都没有算到它,就可能是周围某一个点都比它近,对吧?那这个点是不是就没有用啊。
30:07
所以呢,这个点我们是不是就不要更新了呀?啊,所以这是一个就是king里边的一个想法,大家会想到我们没有必要大家想是不是有可能出现这种情况,比方说在我们一开始的时候,你取质心啊,在这里我一个质心取到这里这个角。另外一个质心我随机随到了最角上,那他家想最角上这个质心再去分类的时候,能分到这一类来吗?是不是前面的这一个点肯定都比他离得近啊啊,所以大家就会注意,就是如果出现这种情况的话,我们就没必要计算了,对吧?啊,所以我们在这里边首先排除掉。排除掉,呃,就是呃,没有出现在C的里的类别,就不需要做计算了,对吧,好多了这么一句啊,大家只要知道就可以,或者大家不管也可以,你你就去做一个统计,然后呃,再去算,是不是大家会发现你那边既然没有值的话,你只要判断一下,假如我们取出来那个类别没有值,你去处理一下那种啊,不要出现异常报错就可以了,对吧?啊这里的话我们也是把它排除掉,不会后面直接调用一句函数不会报错。
31:29
好,那接下来大家会想到是不是应该。根据data里边,呃,大家会想到data里边,从从data塔里边要选,选的是我们的数的那个坐标,对不对,我们根据的是什么呢。是不是当前是I这一类啊,我们是不是要选出所有类别是I的点,取data里边坐标的均值,然后是不是就可以更星之星了,更新对应的之星就应该是我们的第二个之星对吧?更新第。
32:24
I个智星,好,那大家想到第个执星是什么呢?Self cent choice,这是智新的列表对不对?第个质心是不是里边的I啊,好,它应该等于什么?我们是不是想要去求一个均值啊,对,NP直接掉这个命方法,那么里边是什么呢?里边大家会想到我是不是得拿到所有的data塔啊,对吧?对应的data大家看直接就在data里边取,这里又有一个比较比较厉害的操作啊,大家看我这里边会做一个什么操作,C的等于I。
33:10
这是一个什么什么意思?Cin的等于I,这是一个,这是一个逻辑判断表达式对吧?所以它应该是一个布尔类型对吧,而且这个特别的是S的是不是本身是一个数组啊。而在Python里面,数组是可以直接跟一个数去做判断的,它返回的也是一个数组,是一个什么数组呢?是一个布尔类型的数组,所以大家就会看到这个数组等于I,它返回的就相当于是什么呢?就看这个数组里边的每一个元素是不是等于I对吧?如果它等于I的话,是不是就是处啊,对应的那个位置就是处,如果是不等于I的话,返回就是false,那这个data里边给这么一个true false这样的一个一个一个列表一个数组,这表达什么意思呢?
34:03
这个叫就是Python当派里边的布尔索引啊,这用到了一个布尔索引啊,呃啊,这个就是等一下给大家做测试的时候,大家看一眼吧,这个布尔索引选取出来的就是什么东西呢?就是这里边为触的那些值data为触的那些对应的data里面的纸把它拿出来。呃,所以大家会想到那是不是拿出来的就全是类别是I的这一这这一类值啊,对吧,这这些坐标,所以那么我们接下来这些值是不是要取命字。那大家想一下这个data本身它长的样子是是啊,就是很多行N乘以二对不对,它还是一个矩阵对吧,那我们直接这个命求这个均值的话,是不是所有的值全求命了。我们现在应该是。是不是应该两个坐标维度分别求均值啊?我们最后要得到的应该是一个什么东西?
35:10
得到的是一个点对吧,一个点在我们这里边相当于是什么,是不是一行。数据啊,对吧,一行两列的一个矩阵数据对不对,所以我们这里边做命计算的时候,这个矩阵计算是不是要也是指定一个轴,这个轴是是不是要等于零啊,最后是不是要得到一行的数据,它的效果就相当于是把之前的每一列做了一个均值计算。然后行这个是,呃,就是本身的这个列列数是不变的对不对,两列还是两列,只不过每一列做了一个均值计算,最后得到的是一行啊,所以大家看这个xis等于零,表达是这样一个含义,好,那大家会想到这个做完之后,那其实是不是所有迭代结束之后,这个三就已经搞定了呀,那这个也不用return,因为是不是就保存在我们的这个类的三这个属性里边了啊,所以那接下来我们其实要做的就是还应该有一个预测方法,对不对,实现。
36:27
预测方法,那么这个预测方法是不是就是一个predict?呃,它里边还是第一个参数是self对吧?那大家会想到这个预测的时候是不是得输入一组样本点啊,对吧,那我们把这个就叫做samples吧,新来的测试数据对吧?我们不知道它属于哪一类,要做一个分类,那这个预测怎么怎么预测呢?这个是不是跟上面一样啊,大家会想到对,跟上面一样,先计算距离对不对。
37:09
距离矩阵,然后选取。距离最近的那个智星的类别对不对?大家想一想,我们前面第一步是不是算距离啊,所以这里面一样啊,直接把它copy过来,Distance等于CD,那这里就不是data了,应该是sample,对吧,Samples。然后第二步大家会想到是不是应该是C印的这个得到的是不是就是它的那个最后的分类啊,哎,所以这其实就是这一步啊,我们把这个直接拿过来就可以了,Cin的等于它,那最后我们是不是把对得到的这个c in的去return啊,这就实现了这样的一个预测对不对,当然return回去的是这里如果输入一组数据的话,就是一个数组的话,那么我们这里返回的就是一组类别,对不对啊,就全部会返回,好这样我们就把这个整个KN这个类都已经实现了。
我来说两句