当前位置: 首页 > 股票资讯 >06 K-近邻算法,初中生也能理解的机器学习

06 K-近邻算法,初中生也能理解的机器学习

2023-05-10 14:56:27

继续开始机器学习的征程。


依然用曾经提到过的类似例子吧。有个貌似挺火的相亲节目叫非诚勿扰,搞了很多期了,来来往往的男人大概也有成百上千了吧,如此我们得到了如下的训练数据。



问题很清楚,能不能根据1 - 6号训练数据,来判断7号赵六的结果呢?这里就描述一下我认为机器学习里最容易理解的算法,K-近邻算法。有初中数学水平肯定就能搞懂。


其思路非常简单,在这堆训练数据里,找出3个和赵六最相似(所谓近邻)的人,看看这3个人结果如何。如果2个是成功,1个是失败,那我就认为,赵六大概率能成功了。如果3个都是失败,那赵六估计也凶多吉少。


看到这里第一感觉就是要问,为啥非要找3个啊,找5个不行么?当然可以,K近邻里的K,就是这个意思。找多少个(K个)近邻,可以自己决定。然后我们可以严格点,一定要5个人都是成功,才认为是成功。也可以宽松点,如果5个人里3个都成功了,过50%了,那我也认为可以成功。等等诸如此类,这个都是该算法可以调节的部分。


然后,第二个才是主要的问题,怎么样我才能找出和赵六最相似的人呢?这个,就要提到所谓“距离”的概念了。


其实距离计算,初中应该就已经接触到了。

两个二维点的坐标为(1, 2),(3, 4),那么他们的距离就是 

这就是最经典的欧几里得距离,并且是两个二维数据(向量)的距离。


现在扩展到我们的例子里,现在是两个四维数据

马一   160    帅       5000 

赵六   170    中       7000


想知道它们的距离,能不能照此办理?依样画葫芦一下吧:

好吧,帅 - 中,怎么计算呢? 很简单,这里有一个操作叫作标签的数值化。粗暴一点,丑 = 1,中 = 2, 帅 = 3,这个问题就解决了。


注意一下,数值化也是有说法的。这里1 < 2 < 3, 也就有着这么一个含义,我们认为 丑 < 中  < 帅, 这是普通人的思维。可如果我是一个超级颜值控, 那也许我们应该设定成 丑= 1, 中 = 10, 帅 = 500。


然后马一和赵六这样的名字要数值化也不是不可以,但这样的名字数值化,很难看出其中的意义,这里就只好留给擅长名字算命的大神,将它放弃了。


接下来还有一个问题,李五的收入未知,怎么办?这里办法也很多,最简单的一种是直接忽略李五。


如果你觉得“一个都不能少”,那就可以把李五的收入设为所有训练数据的平均值或者中位数什么的,都是可行的。如果还记得以前提到过平均值受极端值影响过大的话,那么在本例里因为马二这个大佬的存在,设成中位数会比较合理一些。


所以,我们的数据就变成这样

现在 赵六 和 马一 的 ”距离” 就是


如果再仔细一点,我们可以发现,这个距离受收入的影响太大。身高,长相这些,几乎完全可以忽略不计,失去存在的意义了。大家一窝蜂冲着钱去,当然也不是不行,不过终究不宜提倡。那么这里就介绍另外一个工具,称作数据的 “归一化”。


公式同样也很容易理解。


新值 = (旧值 - 本列最小值) / (本列最大值 - 本列最小值)。


很容易看出,每个值就落在了0 到 1的范围。显然用这样的数据计算距离,就不再是一个拜金的算法了。


这样,我们放弃了一些列,把标签数据数值化,处理了缺失数据,再归一化之后,可以对赵六计算与每一个样本的距离了。


得到这样的结果


我们看到,和赵六距离最近的分别是王三,王二和张四。这三个人里两个失败,一个成功。那么,我们可以猜测赵六的结果可能也是遗憾下场吧。


以上就是K近邻算法的基本原理了。它的优点就是简单明了。缺点在于每次进行判断,都要和全部历史数据比对一下,如果有5万条历史数据,要对100个新数据进行判断,那么计算量就是5万*100 = 500万次。


另外一个问题在于,判断的结果不大好解释。我们认为赵六的结果是失败,原因就是和他最相似的几个人都是失败 ,总有点怪怪的。他到底是因为什么失败了呢,身高,长相,收入,哪一个才是姑娘们选择的重点呢?K近邻算法无法给出这个解释。


以后,我们可以看到一些有解释性的算法。


回到股票市场里吧,这个K近邻算法有没有用过呢?注意,我说的是有没有用过,而不是有没有用。答案是经常有人在用,只是不是那么明显。


就说说这张图吧,每年春节前后,总有人贴出这样的图表。


其实本质它就是种维度为 1 的“K近邻”算法,意思就是在A股10年的训练数据里,只考虑 “时间“ 这一个维度,找出距离最“近”的数据(那当然就是10个春节了)。然后根据这些数据的涨跌幅,来判断今年的表现。从这10个“邻居”的表现来看,似乎每年都是持股过节比较好点?2018年春节已过,好像这个的算法预测结果还算凑合?呵呵。其他还有啥行情,国庆行情,都是差不多的道理。


然后,对于距离的算法,欧几里得距离只是其中最常见的一种,还有其他各种距离算法。比如曼哈顿距离,切比雪夫距离等等,这里不详细介绍了,但是下面这个可以看一下:


两个向量 A 和 B

A:     1,   2,    3,   4

B:    80,  70, 80 , 60


第三个向量是

C:   100, 200, 300, 400


C 和 A, B的距离,哪一个更近呢?


如果是继续用以前的欧几里得方法计算,明显 C 肯定距 B 更近。然而也能够一眼看出来,如果是这些数据是股票走势系列的话,C 应该和 A 更相似才对,也就是更“近”。


这样的时间趋势序列,就不再适合用欧几里得方法了,这里适用的是“相关系数”这样一种计算。相关系数的公式略微复杂,就不贴在这里了,有兴趣的网上搜一下也就知道了。


为什么特别提一下这个?因为用相关系数来计算“距离”的思想,在股市里也经常看到,尤其是在技术派里。


以下的情形应该不陌生吧,反正我在股评节目里是经常看到:


大拿贴出指数A在历史上某段时间的走势图,然后发现当前走势和它非常相似。而出现这样的走势图,一个月后是大涨了,所以我们以后也会大涨。。。


是不是准,我这里就不评价了。总之这种思路,本质上就是用相关系数来计算距离的K近邻算法了,而这里的K取值为 1(因为只选了一个时间段的走势),其实如果他多贴出一些和当前相近的历史走势来,说服力更强一些。但问题是万一之后的走势忽涨忽跌,那情形可能就会比较尴尬。


这里我就贴两张有意思的图,就是用K近邻算法,找了一下最近两年里,10个交易日为周期,和当前指数走势比较相近的历史时间段(结合了点位和成交量)


第一张是上证50的。可以看到走势和当前比较相近的时间段集中在2017年8月和2017年12月两段里。问题是一段在10天后继续在往下跌,而另一段在10天后获得了不错的涨幅。恩,信哪段呢?


而下一张是创业板的

比对一下很有意思吧,选出来的时间段都差不多,但结果却正好相反。


所以上证50和创业板这对冤家,是继续互相伤害还是能够比翼双飞,真的很伤脑筋啊:)


好吧,最后,贴一张“行情”做收尾吧。





友情链接

Copyright © 2023 All Rights Reserved 版权所有 上海股票分析平台