邻里算法,机器学习算法_knn

这两日翻了豆蔻梢头晃机械学习实战那本书,算法是没有错,只是代码远远不足本身,作者是个搞算法的,这点从代码上就能够看出来。可是有些地点使用numpy搞数组,搞矩阵,总是以为蹊跷,八个是内需运用三方包numpy,固然那几个包为主能够说必备了,可是对于一些生手,连pip都用倒霉,装的numpy也是各个难点,所以说能毫无仍然尽量不用,第三个就是毕竟是数据,代码样例里面写的唯有多少个case,不过实在选择起来,一定是要上数据库的,要是是array是不符合从数据库中读写多少的。由此综合以上两点,我就把这段代码改成list格局了,当然,也或者有人会说小编对numpy很了解啊,况兼作为标准的数学包,矩阵的演算方面也超级低价,作者不否认,那本身这段代码大概对您不契合,你能够仿效书上的代码,直接照打并明白就好了。

宣示:本篇博文是学习《机器学习实战》朝气蓬勃书的主意行程,系原创,若转发请标注源于。

knn,十分的少说了,网络书上讲这些的一大堆,不难说就是行使新样品new_case的各维度的数值与原来就有old_case各维度数值的欧式间隔总结

  1. K-近邻算法的相像流程:

欧式间隔这里也不说了,有意思味能够去翻自家那篇python_离开衡量,里面写的很详细,并用符号展现表明,你也得以改成棋盘间距或街区间隔试试,速度或然会比欧式间隔快,但照旧安利欧式间隔。

(1)搜聚数据:可以运用别的措施(如爬虫)。

有一些没搞领会的正是,对坐标实行精度化计算那块,实地度量后显著使用直接总结不论是错误率仍旧精度,管理前都要比拍卖后更确切,只怕原代码使用小数点的可能率更加高些呢,只怕这一个总计对于小数总结精度更有扶助

(2)计划数据:间距计算机才能研商所需求的数值,最棒是布局化的数额格式。

闲谈一些,非常少也不少,上边上代码,代码中配有伪代码,方便阅读,借使还看不太了然能够留言,小编把详细注脚加上

(3)剖判数据:可以接收任何措施。

 

(4)测量试验算法:计算基值误差率。

以下是代码中央银行使颜色,选择html的16进制EvoqueGB颜色,在动用时将其改变为10进制数字总计,old_case选用奶油色圈,new_case选拔天蓝圈

(5)使用算法:首先须求输入样板数量和构造化的输出结果,然后运转K-近邻算法推断输入数据分别归属哪个分类,最终接纳对计量出的分类实践后续的拍卖。

淡紫(吊菜子颜色卡塔尔(英语:State of Qatar)

  1. K-近邻算法的伪代码和Python代码

图片 1

对未知种类属性的数据集中的每一种点依次实施以下操作:

墨绛红(吊瓜颜色卡塔尔国

(1)总计已知连串数据汇总的点与近来点之间的间距。

图片 2

(2)依据间距依次增加次序排序。

色情(美蕉颜色卡塔尔(قطر‎

(3)采用与近来点离开最小的k个点。

图片 3

(4)确定前k个点所在类别的产出频率。

土灰(西葫芦颜色卡塔尔(قطر‎

(5)重临前k个点现身频率最高的种类作为当前点的预后分类。

图片 4

程序代码:

代码见下

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]  
    diffMat = tile(inX, (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.iteritems(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]
#!/usr/bin//python
# coding: utf-8

'''
1、获取key和coord_values,样例使用的是list,但是如果真正用在训练上的话list就不适合了,建议改为使用数据库进行读取
2、对坐标进行精度化计算,这个其实我没理解是为什么,可能为了防止错误匹配吧,书上是这样写的
3、指定两个参数,参数一是新加入case的坐标,参数二是需要匹配距离最近的周边点的个数n,这里赢指定单数
4、距离计算,使用欧式距离
  新加入case的坐标与每一个已有坐标计算,这里还有优化空间,以后更新
  计算好的距离与key做成新的key-value
  依据距离排序
  取前n个case
5、取得key
  对前n个case的key进行统计
  取统计量结果最多的key即是新加入case所对应的分组
6、将新加入的values与分组写成key-value加入已有的key-value列队
输入新的case坐标,返回第一步......递归
'''

import operator

def create_case_list():
  # 1代表黄瓜,2代表香蕉,3代表茄子,4代表西葫芦
  case_list = [[25,3,73732],[27.5,8,127492],[13,6,127492],[16,13,50331049],[17,4,18874516],[22,8,13762774],[14,1,30473482],[18,3,38338108]]
  case_type = [1,1,2,2,3,3,4,4]
  return case_list,case_type

def knn_fun(user_coord,case_coord_list,case_type,take_num):
  case_len = len(case_coord_list)
  coord_len = len(user_coord)
  eu_distance = []
  for coord in case_coord_list:
    coord_range = [(user_coord[i] - coord[i]) ** 2 for i in range(coord_len)]
    coord_range = sum(coord_range) ** 0.5
    eu_distance.append(coord_range)
  merage_distance_and_type = zip(eu_distance,case_type)
  merage_distance_and_type.sort()
  type_list = [merage_distance_and_type[i][1] for i in range(take_num)]
  class_count = {}
  for type_case in type_list:
    type_temp = {type_case:1}
    if class_count.get(type_case) == None:
      class_count.update(type_temp)
    else: class_count[type_case] += 1
  sorted_class_count = sorted(class_count.iteritems(), key = operator.itemgetter(1), reverse = True)
  return sorted_class_count[0][0]

def auto_norm(case_list):
  case_len = len(case_list[0])
  min_vals = [0] * case_len
  max_vals = [0] * case_len
  ranges = [0] * case_len
  for i in range(case_len):
    min_list = [case[i] for case in case_list]
    min_vals[i] = min(min_list)
    max_vals[i] = max([case[i] for case in case_list])
    ranges[i] = max_vals[i] - min_vals[i]
  norm_data_list = []
  for case in case_list:
    norm_data_list.append([(case[i] - min_vals[i])/ranges[i] for i in range(case_len)])
  return norm_data_list,ranges,min_vals

def main():
  result_list = ['黄瓜','香蕉','茄子','西葫芦']
  dimension1 = float(input('长度是: '))
  dimension2 = float(input('弯曲度是: '))
  dimension3 = float(input('颜色是: '))
  case_list,type_list = create_case_list()
  #norm_data_list,ranges,min_vals = auto_norm(case_list)
  in_coord = [dimension1,dimension2,dimension3]
  #in_coord_len = len(in_coord)
  #in_coord = [in_coord[i]/ranges[i] for i in range(in_coord_len)]
  #class_sel_result = knn_fun(in_coord,norm_data_list,type_list,3)
  class_sel_result = knn_fun(in_coord,case_list,type_list,3)
  class_sel_result = class_sel_result - 1
  return result_list[class_sel_result]

if __name__ == '__main__':
  a = main()
  print '这货是: %s' %a

代码解释:

测量试验结果,效果还不赖

(1)classify0(卡塔尔(قطر‎函数的八个输入参数:inX
用于分类的输入向量,dataSet是输入的演练样板集,labels是标签向量,最终k是用于接纳方今邻的数额,当中标签向量的成分数目和矩阵dataSet的行数相同。

图片 5

(2)代码中度量五个对象间距的法子是欧几里得公式:

                                                                       
                 图片 6

(3)shape函数是numpy.core.fromnumeric中的函数,它的功用是读取矩阵的长短,举例shape[0]尽管读取矩阵第风流倜傥维度的长度。它的输入参数能够使叁个整数表示维度,也得以是四个矩阵。

(4)tile函数是模板numpy.lib.shape_base中的函数。函数的款式是tile(A,reps卡塔尔

        A的项目差不离具有类型都足以:array, list, tuple, dict,
matrix以至宗旨数据类型int, string, float以至bool类型。

        reps的品类也相当多,能够是tuple,list, dict, array,
int,bool.但不得以是float, string, matrix类型。行列重复copy的次数。

(5)sum函数中步入参数。sum(a,axis=0)或许是.sum(axis=1卡塔尔 ,axis=0
即是日常的相加 ;参加axis=1将来正是将叁个矩阵的每意气风发行向量相加。

(6)argsort函数再次回到的是数组值从小到大的索引值。

 (7卡塔尔(英语:State of Qatar)   get(卡塔尔 函数再次回到字典钦赐键的值,即便值不在字典中再次回到私下认可值。

(8)sorted实行排序,sorted(iterable, cmp=None, key=None, reverse=False卡塔尔(قطر‎

         iterable:是可迭代类型;
         cmp:用于比较的函数,比较什么由key决定;
       
 key:用列表成分的某部属性或函数举办作为主要字,有私下认可值,迭代聚集中的生龙活虎项;
         reverse:排序法规. reverse = True  降序 或然 reverse = False
升序,有暗中同意值。
         重返值:是三个通过排序的可迭代类型,与iterable相通。

3 示例-使用K-近邻算法矫正约会网址的配对功效

3.1 准备数据:从文本文件中解析数据

将待管理数据的格式改正为分类器能够接到的格式。

代码达成:

 1 def file2matrix(filename):
 2     fr = open(filename)
 3     numberOfLines = len(fr.readlines())         #get the number of lines in the file
 4     returnMat = zeros((numberOfLines,3))        #prepare matrix to return
 5     classLabelVector = []                       #prepare labels return   
 6     fr = open(filename)
 7     index = 0
 8     for line in fr.readlines():
 9         line = line.strip()
10         listFromLine = line.split('t')
11         returnMat[index,:] = listFromLine[0:3]
12         classLabelVector.append(int(listFromLine[-1]))
13         index += 1
14     return returnMat,classLabelVector

代码解释:

(1)file2matrix (卡塔尔(قطر‎函数的参数,filename接纳文件名。

(2)open(路线+文件名,读写方式卡塔尔(قطر‎,读写方式:r只读,r+读写,w新建(会覆盖原有文件卡塔尔(قطر‎,a追加,b二进制文件。

(3)readlines(卡塔尔(英语:State of Qatar) 自动将文件内容分析成一个行的列表,该列表能够由 Python
的 for … in … 布局举行拍卖。

(4)len(卡塔尔(قطر‎获得列表中的成分个数。

发表评论

电子邮件地址不会被公开。 必填项已用*标注