Python-机器学习之KNN算法

1.算法知识

KNN(k-Nearest Neighbors)算法是监督学习的典型代表,主要用于分类问题,当我们拥有一个已经分好类的数据集时,我们可以将新的某个数据按照KNN算法分到已有数据集的某一类中去,比如类别有A、B两类,每一类包含的数据如下表:


已有分类表.jpg

现在我们得到了一个新的数据点pointX,希望能够判断出pointX应该归入上述两类中的哪一类中去,这时不妨采用KNN算法来实现。

2.算法步骤

  *1 计算新数据点pointX与所有原来数据点point1,...,point14之间的“距离”d(1),...,d(14);
  *2 将1中计算的距离按照升序排列;
  *3 取前k个与新数据点pointX距离最小的原有数据点;
  *4 计算前k小的点所在类别的出现频率;
  *5 返回4中出现频率最高的类别作为新点pointX的类别。

3.Python代码:

from numpy import * import operator def classify(inputPoint,dataSet,labels,k): dataSetSize = dataSet.shape[0] diffMat = tile(inputPoint,(dataSetSize,1))-dataSet sqDiffMat = diffMat ** 2 sqDistances = sqDiffMat.sum(axis=1) distances = sqDistances ** 0.5 sortedDistIndicies = distances.argsort() classCount = {} for i in range(k): voteIlabel = labels[ sortedDistIndicies[i] ] classCount[voteIlabel] = classCount.get(voteIlabel,0)+1 sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True) return sortedClassCount[0][0]

4.代码详解

*1.shape函数
shape函数常用于返回矩阵的行数和列数,如:
a = array([[1,2,3],[3,2,5]]) a.shape (2,3) #表示该矩阵为2行3列; a.shape[0] 2 #索引为0,则返回行数; a.shape[1] 3 #索引为1,则返回列数;

*2.tile函数
tile函数用来将一个数组重复指定次数,并构成一个新数组,如:
a = [1,2,3] b = tile(a,2) b array([1,2,3,1,2,3]) c = tile(a,(2,1)) c array([[1,2,3], [1,2,3]]) #将a横向扩展2次,纵向保持为1次;

*3.sum函数
矩阵调用sum函数时,用axis的值来指定是对行求和还是对列求和,如:
a = array([[1,2,3],[1,2,3]]) x.sum 12 #不指定axis的值,则默认为求总和; x.sum(axis = 1) array([6,6]) #axis=1,则对行求和; x.sum(axis = 0) array([2,4,6]) #axis=0,则对列求和;

*4.argsort函数
argsort函数返回某数组值从小到大的索引值,如:
x = array([4,1,6]) x.argsort() array([1,0,2])

*5.get函数
get函数通过字典的键,来访问对应的值,如果不存在,在不指定返回值的情况下返回一个None;也可以指定不存在时应该返回的值,如下:
pro_Language = {"C#":"microsoft","Java":"Oracle"} print pro_Language.get('python') # 输出:None None print pro_Language.get('python','N/A') #输出:N/A N/A

5.示例测试

`if name == "main" :
dataset = array([[1.0, 1.1], [1.0, 1.0], [0.0, 0.0], [0.0, 0.1]])
labels = ['A', 'A', 'B', 'B']
X = array([1.2, 1.1])
Y = array([0.1, 0.1])
k = 3
labelX = classify(X,dataset,labels,k)
labelY = classify(Y,dataset,labels,k)
print "Your input is:", X, "and classified to class: ", labelX
print "Your input is:", Y, "and classified to class: ", labelY

Your input is: [ 1.2 1.1] and classified to class: A
Your input is: [ 0.1 0.1] and classified to class: B
`

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

推荐阅读更多精彩内容