然而,算法如何在Python中实现

  介绍

本篇文章给大家分享的是有关资讯算法如何在Python中实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

邻近算法(k-NearestNeighbor)是机器学习中的一种分类(分类)算法,也是机器学习中最简单的算法之一了。虽然很简单,但在解决特定问题时却能发挥很好的效果,因此,学习资讯算法是机器学习入门的一个很好的途径。

资讯算法的思想非常的朴素,它选取k个离测试点最近的样本点,输出在这k个样本点中数量最多的标签(标签)。我们假设每一个样本有m个特征值(财产),则一个样本的可以用一个m维向量表示:X=(x1, x2,…xm),同样地,测试点的特征值也可表示成:Y=(y1, y2,…ym)。那我们怎么定义这两者之间的“距离”呢?

在二维空间中,有:d2=(x1, y1) 2 + 2 (x2, y2),,在三维空间中,两点的距离被定义为:d2=(x1, y1) 2 + 2 (x2, y2),+ (x3 - y3) 2。我们可以据此推广到m维空间中,定义m维空间的距离:d2=(x1, y1) 2 + 2 (x2, y2),+……+ (xm - ym) 2。要实现资讯算法,我们只需要计算出每一个样本点与测试点的距离,选取距离最近的k个样本,获取他们的标签(标签),然后找出k个样本中数量最多的标签,返回该标签。

在开始实现算法之前,我们要考虑一个问题,不同特征的特征值范围可能有很大的差别,例如,我们要分辨一个人的性别,一个女生的身高是1.70米,体重60公斤,是一个男生的身高是1.80米,体重是70公斤,而一个未知性别的人的身高是1.81米,体重是64公斤,这个人与女生数据点的“距离”的平方d2=(1.70 - 1.81) 2 +(60 - 64) 2=0.0121 + 16.0=16.0121,而与男生数据点的“距离”的平方d2=(1.80 - 1.81) +(70 - 64) 2=0.0001 + 36.0=36.0001。可见,在这种情况下,身高差的平方相对于体重差的平方基本可以忽略不计,但是身高对于辨别性别来说是十分重要的。为了解决这个问题,就需要将数据标准化(标准化),把每一个特征值除以该特征的范围,保证标准化后每一个特征值都在0 ~ 1之间。我们写一个normData函数来执行标准化数据集的工作:

def  normData(数据):   时间=maxVals 才能;dataSet.max(轴=0)   时间=minVals 才能;dataSet.min(轴=0)   时间=ranges 才能;maxVals 作用;minVals   retData 才能=,(dataSet 作用;minVals),/范围   return 才能;retData,,,, minVals

,然后开始实现资讯算法:

, def 然而,(标签数据集,还以为,testData, k):   distSquareMat 才能=,(dataSet 作用;testData), * *, 2, #,计算差值的平方   时间=distSquareSums 才能;distSquareMat.sum(轴=1),#,求每一行的差值平方和   时间=distances 才能;distSquareSums  * *, 0.5, #,开根号,得出每个样本到测试点的距离   时间=sortedIndices 才能;distances.argsort(), #,排序,得到排序后的下标   indices 才能=,sortedIndices (k), #,取最小的k个   labelCount 才能=,{},#,存储每个标签的出现次数   for 才能小姐:拷贝指数:   ,,,label =,标签(我)   ,,,labelCount(标签),=,labelCount.get(标签,,0),+,1,#,次数加一   sortedCount 才能=,排序(labelCount.items(),,关键=opt.itemgetter(1),反向=True),   #,才能对标签出现的次数从大到小进行排序   return 才能sortedCount[0][0], #,返回出现次数最大的标签

注意,在testData作为参数传入资讯函数之前,需要经过标准化。

我们用几个小数据验证一下资讯函数是否能正常工作:

if  __name__ ==,“__main__":   dataSet 才能=,np.array ([[2, 3], [6, 8]])   normDataSet才能,,,,minVals =, normData(数据集)   labels 才能=,(& # 39;一个# 39;,,& # 39;b # 39;】   时间=testData 才能;np.array ([3.9, 5.5])   normTestData 才能=,(testData 作用;minVals),/范围   result 才能=,资讯(normDataSet,标签,,normTestData,, 1)   打印才能(结果)

结果输出,与预期结果一致。

完整代码:

import  numpy  as  np   得到math  import √   import  operator  as 选择      def  normData(数据):   时间=maxVals 才能;dataSet.max(轴=0)   时间=minVals 才能;dataSet.min(轴=0)   时间=ranges 才能;maxVals 作用;minVals   retData 才能=,(dataSet 作用;minVals),/范围   return 才能;retData,范围,minVals         def 然而,(标签数据集,还以为,testData, k):   distSquareMat 才能=,(dataSet 作用;testData), * *, 2, #,计算差值的平方   时间=distSquareSums 才能;distSquareMat.sum(轴=1),#,求每一行的差值平方和   时间=distances 才能;distSquareSums  * *, 0.5, #,开根号,得出每个样本到测试点的距离   时间=sortedIndices 才能;distances.argsort(), #,排序,得到排序后的下标   indices 才能=,sortedIndices (k), #,取最小的k个   labelCount 才能=,{},#,存储每个标签的出现次数   for 才能小姐:拷贝指数:   ,,,label =,标签(我)   ,,,labelCount(标签),=,labelCount.get(标签,,0),+,1,#,次数加一   sortedCount 才能=,排序(labelCount.items(),,关键=opt.itemgetter(1),反向=True), #,对标签出现的次数从大到小进行排序   return 才能sortedCount[0][0], #,返回出现次数最大的标签            if  __name__ ==,“__main__":   dataSet 才能=,np.array ([[2, 3], [6, 8]])   normDataSet才能,,,,minVals =, normData(数据集)   labels 才能=,(& # 39;一个# 39;,,& # 39;b # 39;】   null   null   null   null

然而,算法如何在Python中实现