《机器学习实战》之knn算法

  买了王斌老师翻译的《机器学习实战》一书,里面全是干货,既可以练python,又可以学习机器学习算法知识,挺不错的,学习一些东西这里分享下。

  k-近邻算法(knn),它的核心思想就一句话,如果两个东西各方面属性都很相似,那么这两个东西属于同一类。k的意思是有很多东西和你要判断的东西相似(称作x),

 那么找出和x各方面属性最相似的k个东西,如果这k个东西里面大部分都属于类C,那么x就属于类C。

  好了,来分析一下这个算法需要的数据,首先要判断的东西x,我们称作测试集,我们知道x各种属性的值(后面统称特征),但是不知道x属于哪一类,结果就是求这个。

还有其他很多东西,我们不仅知道它们的特征,还知道它们属于哪一类,这些东西称作训练集。

    来个书上简单的例子说明下:

    电影名称    打斗镜头    接吻镜头    电影类型

California Man        3        104      爱情片

He's Not---         2        100      爱情片

Beautiful Woman     1        81      爱情片

x          18        90      ?

上面这个表大家可以看到电影这个东西有三个特征,电影名称,打斗镜头,接吻镜头,前三个电影我们知道他们的类别,他们属于训练集,后面一个电影x我们只知道他们的特征,不知道类别,怎么用knn来算这个。

1.算x和其他电影的相似度

2.找出最相似的k个电影

3.对这k个电影的类别进行排名,选择类别最多的作为x的类别。

相似度的计算采用的是欧式距离法,d=((x1-x2)2+(y1-y2)2+(z1-z2)2)1/2,对于一个电影i可以表示成(xi,yi,zi),x,y,z分别表示电影三个特征的值。

注意:x,y,z的值一般需要缩放至0-1之间,保证每个特征具有相同的权重,newValue=(oldValue-min)/(max-min).

下面附上一段书上关于knn算法一个小例子:

'''
2013.12.26
《机器学习实战》knn小实例源码学习
'''
from numpy import *
import operator

def createDataSet():
    group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels=['A','A','B','B']
    return group,labels
    
def classify0(inX,dataSet,labels,k):
    #shape是array的一个属性,返回矩阵array的各个维度大小
    dataSetSize=dataSet.shape[0]
    #tile函数表示将inX在x轴上重复dataSetSize次,y轴上重复1次
    diffMat=tile(inX,(dataSetSize,1))-dataSet
    #**用于矩阵做幂运算,每个维数值的平方。
    sqDiffMat=diffMat**2
    #sum函数,axis=1,表示将[]里面数相加(列相加),axis=0表示(行相加),axis=None(行列相加)
    sqDistances=sqDiffMat.sum(axis=1)
    #下面这就是距离了,开根号
    distances=sqDistances**0.5
    #返回distances排序的索引,用于下面查找标签
    sortedDistIndicies=distances.argsort()
    classCount={}
    for i in range(k):
        voteIlabel=labels[sortedDistIndicies[i]]
        #统计标签个数
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
    #operator 类有意思,可以看看    
    sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]
group,labels=createDataSet()
print(classify0([0,0],group,labels,3))

'''
小程序可以发散的知识点:
1.tile函数理解,可以自己写个简单实现源码
2.sorted函数帮助文档看懂,实现猜想,理解
3.operator类应该是操作符重载里面一些东东,可以看看
学语言最快果然还是看源码,一些功能别人实现的总是简洁些。
'''

我用的是python 3.2,低版本可能有些名字需要改一下。

knn算是一个很简单的机器学习算法,它的假设是各特征彼此相互独立,并且权重相同(各特征都做了归一化,当然你也可以加上权重值)。

好好学习,天天向上!

原文地址:https://www.cnblogs.com/huals/p/3493983.html