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
  • 相关阅读:
    【毒链剖分】
    线段树——从入门到入土
    二分图最大匹配——找老婆问题(确信)
    【AC自动机(有了这个我就能AC了吗)】
    社交距离II
    【扩展KMP(Z函数)(这个区间看着不是很爽)】
    【KMP算法(烤馍片,真香)】
    【最短路系列问题】
    最近公共祖先LCA(我肯定是你的LCA)
    【并查集(又在乱牵线了)】
  • 原文地址:https://www.cnblogs.com/wangxiaoyong/p/5452812.html
Copyright © 2011-2022 走看看