本文转载自公众号 信口杜说
KNN是机器学习中一种基础的数据分类算法,这里我通过一个故事来给大家叫明白它到底有什么用。
从一个笑话开始。
相亲时,姑娘很漂亮,问小伙子:你有三室两厅的楼房么?
小伙子:没有。
姑娘又问:有宝马5么?
小伙子:没有。
姑娘很不高兴:那算了。
相亲结束。小伙子很沮丧,回去跟父母说了这事。
父亲愁眉苦脸:车好说,把咱的宾利买了能买好几两宝马,
可是咱犯不上为了这事把咱的大别墅换成三室两厅的楼房啊。
在这个笑话里姑娘的相亲匹配算法有问题,太粗暴,太简单,并且没有把相亲标准数据化,标准定制的太笼统了。
不应该定三室两厅的标准,应该是看房子的大小,平米数。
也不能把车的标准定成上面品牌的车,应该看车子的价格。
导致错过了一段大好姻缘。
假如姑娘用KNN算法,来挑选相亲对象,那么她一定不会犯上面那样的错误。
我们来用KNN算法帮姑娘找到理想的结婚对象。
一般姑娘的相亲对象分为三类A(特别满意,恨不得明天就去领证),
B(感觉一般,可以相处一段时间再看看),
C(不满意,以后不想再联系)。
而判断相亲对象类型的标准2条,房子大小,车辆价格。
下面是几个别人家姑娘的男朋友的数据,我们这里作为参考(也叫样本数据):
男生名字 | 房子大小 | 车辆价格 | 相亲类别 |
王思聪 | 1000000平(万达的房子都是他们家的) | 500万 | A(特别满意) |
吴亦凡 | 5000平 | 200万 | A(特别满意) |
李有财 | 120平 | 60万 | B(处处看看) |
高很富 | 200平 | 50万 | B(处处看看) |
王小明 | 60平 | 10万 | B(处处看看) |
刘没钱 | 12平(租的) | 0.2万(电动车) | C(pass掉) |
现在有个相亲对象,赵大平,情况是这样房子100平,车30万,
那他应该是什么类型的相亲对象那?
我们来计算一下他和上面的样本数据之间的差距(也叫距离),
这里我们使用曼哈顿距离(啥叫曼哈顿距离,百度)
男生名称 | 赵大平和他们的差距 |
王思聪 | |1000000-100|+|500-30|=999900+470=1000370(差距巨大啊) |
吴亦凡 | |5000-100|+|200-30|=4900+170=5070(差距也不小) |
李有财 | |120-100|+|60-30|=20+30=50(很接近了) |
高很富 | |200-100|+|50-30|=100+20=120(比较接近了) |
王小明 | |60-100|+|10-30|=40+20=60(比较接近了) |
刘没钱 | |12-100|+|0.2-30|=88+29.8=117.8 |
那我们对上面的数据按从小到大排个序:
男生名称 | 赵大平和他们的距离(从小到大) |
李有财 | 50 |
王小明 | 60 |
刘没钱 | 117.8 |
高很富 | 120 |
吴亦凡 | 5070 |
王思聪 | 1000370 |
这里我们取前4个男生(当然也可以取3个,取5个,取的少不准,取的多准确,但是复杂,一般不超过20):
李有财(B类型),王小明(B类型),刘没钱(C类型),高很富(B类型)。
在这前4个距离赵大平最近的男生里,B类型的最多(3/4,也就是75%),
C类型的少(1/4,也就是25%)。
那么我们就取占比最大的类型,也认为赵大平是B类型的,可以处处。
这就是KNN算法(K-NearestNeighbor)。
也有同学会问:这么麻烦干嘛,姑娘以前的标准是简单,但是你的也太麻烦了,又是样本数据,又是排序的。能不能划分区间啊,房子大于500平米的特别满意,500平米到90平米的可以处处,不到90平米的PASS不行,这多简单。
但是现实情况比较复杂,好多事没有确定的边界。你设定90为边界,那来个89的那?按照区间的划分,这个就PASS掉了,可实际情况90和89差不多。没法子划区间。
—————END—————
喜欢本文的朋友们,欢迎关注公众号 程序员小灰,收看更多精彩内容
