刚开始学习机器学习,先跟这《机器学习实战》学一些基本的算法

----------------------------------分割线--------------------------------------------

该算法是用来判定一个点的分类,首先先找到离该点最近的k个点,然后找出这k个点的哪种分类出现次数最多,就把该点设为那个分类
距离公式选用欧式距离公式:

下面给出例子(来自《机器学习实战》)

1.约会对象喜欢程度的判定:

现需要一个约会对象喜欢程度的分类器

给定数据集,属性包含

每年获得的飞行常客里程数,玩视频游戏所耗时间百分比,每周消费的冰淇淋公升数,是否喜欢且喜欢程度(不喜欢,一般喜欢,特别喜欢),四个属性

分类器代码:

先获取整个数据集的约会对象个数t,然后把我们要分类的矩阵复制t次

然后减去原数据集,得到xA0-xB0和xA1-xB1,然后对矩阵每个元素平方,行内求和,开根号,得到所有点的距离

统计前k个数据类别出现次数,返回次数最多的类别

  1. def classify0(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.iteritems(), key=operator.itemgetter(1), reverse=True)
  13. return sortedClassCount[0][0]

先从文件中分别读前三个属性和喜欢程度到矩阵

然后进行归一化,最后分类得到结果统计一下就好了

  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
  15.  
  16. def autoNorm(dataSet):
  17. minVals = dataSet.min(0)
  18. maxVals = dataSet.max(0)
  19. ranges = maxVals - minVals
  20. normDataSet = zeros(shape(dataSet))
  21. m = dataSet.shape[0]
  22. normDataSet = dataSet - tile(minVals, (m,1))
  23. normDataSet = normDataSet/tile(ranges, (m,1)) #element wise divide
  24. return normDataSet, ranges, minVals
  25.  
  26. def datingClassTest():
  27. hoRatio = 0.50 #hold out 10%
  28. datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom file
  29. normMat, ranges, minVals = autoNorm(datingDataMat)
  30. m = normMat.shape[0]
  31. numTestVecs = int(m*hoRatio)
  32. errorCount = 0.0
  33. for i in range(numTestVecs):
  34. classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
  35. print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i])
  36. if (classifierResult != datingLabels[i]): errorCount += 1.0
  37. print "the total error rate is: %f" % (errorCount/float(numTestVecs))
  38. print errorCount

2.数字识别

给定训练集包含32*32的01字符串,然后判定测试集的数字

对于把32*32每个数字都看作一个属性,然后直接算距离分类...

  1. def img2vector(filename):
  2. returnVect = zeros((1,1024))
  3. fr = open(filename)
  4. for i in range(32):
  5. lineStr = fr.readline()
  6. for j in range(32):
  7. returnVect[0,32*i+j] = int(lineStr[j])
  8. return returnVect
  9.  
  10. def handwritingClassTest():
  11. hwLabels = []
  12. trainingFileList = listdir('digits/trainingDigits') #load the training set
  13. m = len(trainingFileList)
  14. trainingMat = zeros((m,1024))
  15. for i in range(m):
  16. fileNameStr = trainingFileList[i]
  17. fileStr = fileNameStr.split('.')[0] #take off .txt
  18. classNumStr = int(fileStr.split('_')[0])
  19. hwLabels.append(classNumStr)
  20. trainingMat[i,:] = img2vector('digits/trainingDigits/%s' % fileNameStr)
  21. testFileList = listdir('digits/testDigits') #iterate through the test set
  22. errorCount = 0.0
  23. mTest = len(testFileList)
  24. for i in range(mTest):
  25. fileNameStr = testFileList[i]
  26. fileStr = fileNameStr.split('.')[0] #take off .txt
  27. classNumStr = int(fileStr.split('_')[0])
  28. vectorUnderTest = img2vector('digits/testDigits/%s' % fileNameStr)
  29. classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
  30. print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr)
  31. if (classifierResult != classNumStr): errorCount += 1.0
  32. print "\nthe total number of errors is: %d" % errorCount
  33. print "\nthe total error rate is: %f" % (errorCount/float(mTest))

K相邻算法的更多相关文章

  1. 从K近邻算法谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...

  2. 机器学习(Machine Learning)算法总结-K临近算法

    一.算法详解 1.什么是K临近算法 Cover 和 Hart在1968年提出了最初的临近算法 属于分类(classification)算法 邻近算法,或者说K最近邻(kNN,k-NearestNeig ...

  3. 分类算法----k近邻算法

    K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的 ...

  4. 用Python从零开始实现K近邻算法

    KNN算法的定义: KNN通过测量不同样本的特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.K通 ...

  5. R语言学习笔记—K近邻算法

    K近邻算法(KNN)是指一个样本如果在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.即每个样本都可以用它最接近的k个邻居来代表.KNN算法适 ...

  6. Python3入门机器学习 - k近邻算法

    邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...

  7. 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    转载自:http://blog.csdn.net/v_july_v/article/details/8203674/ 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说: ...

  8. 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!

    1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...

  9. 机器学习算法之K近邻算法

    0x00 概述   K近邻算法是机器学习中非常重要的分类算法.可利用K近邻基于不同的特征提取方式来检测异常操作,比如使用K近邻检测Rootkit,使用K近邻检测webshell等. 0x01 原理   ...

随机推荐

  1. Java IO 学习总结 学习手册总结

    Java IO 是一套Java用来读写数据(输入和输出)的API.大部分程序都要处理一些输入,并由输入产生一些输出.Java为此提供了java.io包. 代码 github地址:https://git ...

  2. IS-IS完整笔记

    IS-IS笔记大全 1.公开,ISO国际标准化组织(按照中文顺序翻译) 中间系统到中间系统 双栈.集成 数据传递机制 Cons面向连接网络服务(TCP) Clns缺少链接网络服务(UDP) Is-is ...

  3. HTML的基本标签及语法

    一.HTML基本标签head部分 HTML文档的基本结构 <!DOCTYPE html> <html> <head> <meta charset=" ...

  4. 团队作业8----第二次项目冲刺(Beta阶段) 第七天

    BETA阶段冲刺第六天 1.小会议ing 2.每个人的工作 (1)昨天已完成的工作 完成查重部分  (2) 今天计划完成的工作 (3) 工作中遇到的困难: 尤少辉:在测试的时候发现了,文件名保存到数据 ...

  5. [2017BUAA软工助教]第0次个人作业

    学习别人的经验和体会 零.前言 我认为人生就是一次次地从<存在>到<光明>. 一.软件工程师的成长 0.这是一个博客索引 同学们在上这门课的时候基本都是大三,觉得在大学里,到教 ...

  6. 201521123091 《Java程序设计》第3周学习总结

    Java 第三周总结 第三周的作业. Java 第三周总结 1.本章学习总结 2.Java Q&A 1.代码阅读 2.构造函数有什么用?其编写格式是什么?如果一个类不写构造函数,它有构造函数吗 ...

  7. 201521123087《Java程序设计》 第八周学习总结

    1. 本周学习总结 2. 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1)1.1 实验总结                                               ...

  8. 201521123093 java 第七周学习总结

    1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 //contains()方法 public boolean contains ...

  9. 201521123121 《Java程序设计》第3周学习总结

    本周学习总结 书面作业 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; public st ...

  10. Python-老男孩-03_socket

    Socket简介: 所谓Socket也称"套接字",用于描述IP和端口,是一个通信链的句柄,应用程序通过"套接字"向网络发出请求或应答网络请求. Socket起 ...