机器学习实战--KNN

来源:互联网 发布:网络信息发布平台 编辑:程序博客网 时间:2024/05/01 13:04

KNN概要

knn是最简单的分类算法,需要自定义一个参数K。(如何选择适当的k,这个就是一个研究方向哦),输入一个想要分类的点a,计算出a与数据集中最近的k个点,然后k个点中大多数属于的类就是输入点a属于的类。

python code

from numpy import *import operatordef create_data_set():    group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])    labels=['A','A','B','B']    return group,labelsdef classfy(input,data_set,labels,k):    dataset_size=data_set.shape[0]    #将输入样本点重复多次,求输入与数据集中每一个样本的距离    diffMat=tile(input,(dataset_size,1))-data_set    sqdiffMat=diffMat**2    sqdistance=sqdiffMat.sum(axis=1)    distance=sqdistance**0.5    sorted_dist_indicies=distance.argsort()    class_count={}#dict    #从最近的k个样本中统计属于某一类的个数,占多数的类为输入样本的类    for i in range(k):        vote_label=labels[sorted_dist_indicies[i]]        class_count[vote_label]=class_count.get(vote_label,0)+1    #对字典进行排序,按照值来反向排序。       sorted_class_count=sorted(class_count.iteritems(),key=operator.itemgetter(1),reverse=True)    return sorted_class_count[0][0]t,l=create_data_set()classfy([0.85,1],t,l,3)

实例:改进约会网站的配对效果

收集约会数据,每一个约会对象的三个特征:飞行里程数,玩游戏百分比,冰淇淋公升数;以及三个分类不喜欢,一般魅力,极具魅力。
数据格式:
40920 8.326976 0.953952 largeDoses
14488 7.153469 1.673904 smallDoses
26052 1.441871 0.805124 didntLike
75136 13.147394 0.428964 didntLike
38344 1.669788 0.134296 didntLike
72993 10.141740 1.032955 didntLike
35948 6.830792 1.213192 largeDoses
42666 13.276369 0.543880 largeDose

其实非常简单,直接应用上面的算法,需要先将类别映射到数字1,2,3,将三种特征归一化。代码请看:
https://github.com/huanghuoxian/Machine-Learning-in-action/tree/master/ML_in_action/KNN

手写数字识别

每一个图片类似:
00000000000001100000000000000000
00000000000011111100000000000000
00000000000111111111000000000000
00000000011111111111000000000000
00000001111111111111100000000000
00000000111111100011110000000000
00000001111110000001110000000000
00000001111110000001110000000000
00000011111100000001110000000000
00000011111100000001111000000000
00000011111100000000011100000000
00000011111100000000011100000000
00000011111000000000001110000000
00000011111000000000001110000000
00000001111100000000000111000000
00000001111100000000000111000000
00000001111100000000000111000000
00000011111000000000000111000000
00000011111000000000000111000000
00000000111100000000000011100000
00000000111100000000000111100000
00000000111100000000000111100000
00000000111100000000001111100000
00000000011110000000000111110000
00000000011111000000001111100000
00000000011111000000011111100000
00000000011111000000111111000000
00000000011111100011111111000000
00000000000111111111111110000000
00000000000111111111111100000000
00000000000011111111110000000000
00000000000000111110000000000000

需要将图片二维转化为一维,

#数据集的一张图片是32*32  转化为1*1024def img2vector(filename):    returnVect = zeros((1,1024))    fr = open(filename)    for i in range(32):        lineStr = fr.readline()        for j in range(32):            returnVect[0,32*i+j] = int(lineStr[j])    return returnVect

然后应用上面的knn分类算法,只不过现在每一个点是有1024个维度来表示,求距离的时候有1024个平方和。
代码:https://github.com/huanghuoxian/Machine-Learning-in-action/tree/master/ML_in_action/KNN

总结


knn是最简单的分类算法,需要指定k,在输入点距离数据集中最近的k个点中,这k个点属于最多的类别,就是输入点的分类。
在实例中由于特征的取值范围相差过大,为了保证分类效果,进行归一化。

Python 字典(Dictionary) get()方法
描述
Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值。
语法
get()方法语法:
dict.get(key, default=None)
参数
key – 字典中要查找的键。
default – 如果指定键的值不存在时,返回该默认值值。
返回值
返回指定键的值,如果值不在字典中返回默认值None。

机器学习实战 Peter Harrington
http://www.runoob.com/python/att-dictionary-get.html

0 0
原创粉丝点击