知识篇——初步KNN算法认识

写在前面

网上有非常多非常好的文章,比如这篇:机器学习(一)——K-近邻(KNN)算法

再深一点,还有822成员开心同学的这篇:用KNN解决非线性回归问题

不过我在学习的时候,概念读得很快,但是没有直接认识,不理解,这时候就要借助读代码去直接体悟。但是往往,入门如我,语言学的又不是很好,就很想代码后面注释的详细一点。其实详细点也不用,最好是直接把数据怎么流动的展示给我,我先不读代码,我想先知道这个KNN是怎么工作的。那我的这篇文章可能做的就是这样一个工作。

什么是KNN

KNN就是K邻近,什么是K邻近呢,就是离我要预测的这个数据最近的K个数据中大部分都是什么标签,那么我这个数据就是这个标签(不懂去戳第一个链接)。注意,不是我离谁最近我就是谁,而是在我指定的一个范围内,谁最多我是谁。KNN就是小众里的随大流。

一个例子

我本来有[10, 8], [12, 13], [3, 4], [4, 5]这样四个点,标签分别是B、A、A、B,这是已知的。现在又来了一个点[0, 1],我问你,这个点是A还是B?KNN就可以来解决这样的问题。我们从图上来看一下:

Paste_Image.png

红色的点就是[0, 1],直观上来看,一看它离A最近,你可能会说它是A,不是这样的。我们说KNN算法是一个范围内的,谁最多我是谁,所以你应该先问:范围是多少。这个范围,就是K。比如,K是2,那意思就是离它最近的2个点,在这个例子里是左下角的两个点,一个A,一个B,那我们取最近的那个,就是A。如果K是3,那就是最近的3个点,一个A,两个B,随大流,那[0, 1]这个的标签就是B,尽管它离A最近。

好了,这样一个简单的要求,怎么落实到程序上?我们来看代码:

代码

不用说,我们得先有这四个点,而且还得有对应的标签:

# -*- coding: utf-8 -*-

from numpy import *
import operator
import matplotlib.pyplot as plt

# 创建数据集和标签,Python可以返回两个值
def createDataSet():
    group = array([[10, 8], [12, 13], [3, 4], [4, 5]])
    labels = ['B', 'A', 'A', 'B']
    return group, labels

group, labels = createDataSet()

group长这个样子:

[[10  8]
 [12 13]
 [ 3  4]
 [ 4  5]]

labels是这样的:

['B', 'A', 'A', 'B']

注意它俩的类型是不一样的,group的类型是:numpy.ndarray,而labels是list。

现在我们要求新进来的这个点[0, 1]分别到四个点的距离,你首先想到的一定是写个for循环挨个算一遍,但是这里我们用一个很巧妙的方法去算。我们把[0, 1]也写成一个矩阵,让两个矩阵做欧氏距离,这里不科普什么是欧氏距离,示意图如下:

但是最后得出的这个矩阵不好排序,所以我们让它成为一个numpy.ndarray,这样就可以方便的排序。代码这里是一个非常迷惑人的点,你可以翻下面的代码,这句是这么写的:sortedDistIndicies = distance.argsort() 。而这个 sortedDistIndicies 长这样:[2 3 0 1]。它是什么意思呢?意思就是,最大的数是之前array中的第2个,第二大的数是之前array中的第3个,第三大的数是之前array中的第0个,第四大的数是之前array中第1个。

这样的好处就是,如果你的K值取3,就是要挑4个数据的前3个数据,那么你只要找sortedDistIndicies 中前三个数值,按照这三个数值告诉你的位置回到标签集里找对应标签,看看A多还是B多就行了。

代码如下:

# K-近邻算法
def classify0(inX, dataSet, labels, k):  # 参数k表示用于选择最近邻居的数目
    dataSetSize = dataSet.shape[0]  # 返回数据集的行数
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet
    # print 'diffMat: ', diffMat
    sqDiffMat = diffMat ** 2  # ** 代表n此方
    sqDistance = sqDiffMat.sum(axis=1)
    distance = sqDistance ** 0.5
    sortedDistIndicies = distance.argsort()  # 排序
    print "sortedDistIndicies: ", sortedDistIndicies
    classCount = {}  # 注意,这是一个字典
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1),
                              reverse=True)  # 排序,此处的排序为逆序,即按照从最大到最小次序排序
    return sortedClassCount[0][0]

最后为什么要返回 sortedClassCount[0][0] ?假设,你K取3,最近的三个点里有2个B、1个A,它在sortedClassCount中是这样显示的: [('B', 2), ('A', 1)]。sortedClassCount[0] 是 ('B', 2),sortedClassCount[0][0]就是‘B’了。

把代码复制粘贴到你的编译环境里,最后加一行打印试一试吧:

print classify0([0, 1], group, labels, 3)

我们的822,我们的青春
欢迎所有热爱知识热爱生活的朋友和822实验室一起成长,吃喝玩乐,享受知识。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容