zoukankan      html  css  js  c++  java
  • 《机器学习实战》学习笔记一K邻近算法

       一、 K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征(向量的每个元素)与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似的的分类标签。由于样本集可以很大,我们选取前k个最相似数据,然后统计k个数据中出现频率最高的标签为新数据的标签。

      K邻近算法的一般流程:

      (1)收集数据:可以是本地数据,也可以从网页抓取。

      (2)准备数据:将数据结构化,方便操作。

      (3)分析数据:可以使用任何方法。

      (4)训练算法:此步骤不适用于k邻近算法。

      (5)测试算法:计算错误率;计算公式:错误率=测试出错次数/总测试次数

      (6)使用算法:输入样本数据,输出结构化的结果,判断新数据属于哪个分类。

      二、使用K近邻算法的一个例子

      我使用的是spyder的开发环境,python的版本是3.5,spyder自带了numpy函数库。新建一个KNN.py文件,在本文件中完成本章实验。

      在KNN中写一个数据生成函数:

    
    
    1 from numpy import *
    2 import operator
    3 
    4 def createDataset():
    5     group = array([[1.0,1.1],[1.0,1.0],[0.0,0.0],[0.0,0.1]])
    6     labels = ['A','A','B','B']
    7     return group,labels
    
    

      在spyder中输入 :

      >>> import KNN

      >>>group,labels = KNN.createDataSet()

      >>>group 

      array([[ 1. , 1.1],
         [ 1. , 1. ],
         [ 0. , 0. ],
         [ 0. , 0.1]])

      >>>labels 

      ['A', 'A', 'B', 'B']

      出现以上提示则说明函数正确。

      三、K近邻算法函数

      

     1 def classify(inX,dataset,labels,k):
     2     dataSetSize = dataset.shape[0]
     3     diffMat = tile(inX,(dataSetSize,1))-dataset
     4     sqDiffMat = diffMat**2
     5     sqDistances = sqDiffMat.sum(axis=1)
     6     distances = sqDistances**0.5
     7     sortedDistIndicies = distances.argsort()
     8     classCount ={}
     9     for i in range(k):
    10         voteIlabel = labels[sortedDistIndicies[i]]
    11         classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
    12     sortedClassCount = sorted(classCount.items(),
    13                               key=operator.itemgetter(1),reverse=True)
    14     return sortedClassCount[0][0]

      验证:在spyder中输入

      >>> KNN.classify([0,0],group,labels,3)

      输出结果应该为'B'。

      四、例子:约会网站匹配改进

      海伦收集约会数据已经有一段时间,她把这些数据放在文本文件datingdata.txt中,每个样本数据占据一行,共有1000行(她可能约会过1000个人,太可怕了^_^),每个样本主要包括以下3中特征:

      1、每年获得的飞行常客里程数

      2、玩视频游戏所耗的时间百分数

      3、每周消费的冰激凌公升数

      上述数据保存在文本文件中,数据之间以空格间隔,在数据输入分类器之前,必须将待处理数据改变为分类器可以处理的数据,在KNN中创建名为file2matrix的函数,进行数据处理。

     1 def file2matrix(filename):
     2     fr = open(filename,'r')
     3     arrayOLines = fr.readlines()
     4     numberOfLines = len(arrayOLines)
     5     returnMat = zeros((numberOfLines,3))
     6     classLabelVector = []
     7     index = 0
     8     for line in arrayOLines:
     9         line = line.strip()
    10         listFromLine = line.split('	')
    11         returnMat[index,:] = listFromLine[0:3]
    12         classLabelVector.append(int(listFromLine[-1]))
    13         index += 1
    14     return returnMat,classLabelVector
    15 retarnmat,classlabelvector = file2matrix('datingdata.txt')

      在我运行这段程序,总是出现错误提示:could not convert string to float: '12 34 56',对于这个问题,我的改法是将文本中数据间的空格改为','并将

    listFromLine = line.split('	')改为
    listFromLine = line.split(',')
    这样就可以解决问题,但是不是最好的方法,还需要改进。
    pp
  • 相关阅读:
    与众不同 windows phone (50)
    与众不同 windows phone (49)
    重新想象 Windows 8.1 Store Apps (93)
    重新想象 Windows 8.1 Store Apps 系列文章索引
    重新想象 Windows 8.1 Store Apps (92)
    重新想象 Windows 8.1 Store Apps (91)
    重新想象 Windows 8.1 Store Apps (90)
    重新想象 Windows 8.1 Store Apps (89)
    重新想象 Windows 8.1 Store Apps (88)
    重新想象 Windows 8.1 Store Apps (87)
  • 原文地址:https://www.cnblogs.com/wangxiaoyong/p/5452812.html
Copyright © 2011-2022 走看看