买了王斌老师翻译的《机器学习实战》一书,里面全是干货,既可以练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算是一个很简单的机器学习算法,它的假设是各特征彼此相互独立,并且权重相同(各特征都做了归一化,当然你也可以加上权重值)。
好好学习,天天向上!