海伦收集约会数据巳经有了一段时间,她把这些数据存放在文本文件datingTestSet.txt中,每个样本数据占据一行,总共有 1000 行。海伦的样本主要包含以下 3 种特征:
  1. 每年获得的飞行常客里程数
  2. 玩视频游戏所耗时间百分比
  3. 每周消费的冰淇淋公升数
  在将上述特征数据输人到分类器之前,必须将待处理数据的格式改变为分类器可以接受的格式。在 kNN.py 中创建名为 file2matrix的函数,以此来处理输人格式问题。该函数的输人为文件名字符串输出为训练样本矩阵和类标签向量,整体程序如下:

1. 读取测试数据文件

 # 读取测试数据文件
def read_file(filename):
datafile = open(filename)
lines = datafile.readlines();
length = len(lines)
marix = zeros((length,))
classLabelVector = []
index =
for line in lines:
line = line.rstrip()
words = line.split("\t")
marix[index,:]=words[:]
classLabelVector.append(float(words[-]))
index = index +
return marix,classLabelVector

2. 测试数据归一化

  在处理不同取值范围的特征值时,我们通常采用的方法是将数值归一化,如将取值范围处理为0到1或者-1到1之间,下面的公式可以将任意取值范围的特征值转化为0到1区间内的值 :newValue = (oldValue-min)/(max-min),具体程序如下:

 def autoNorm(dataSet):
minVals = dataSet.min()
maxVals = dataSet.max()
range = maxVals - minVals
normDataSet = zeros(shape(dataSet))
m = dataSet.shape[]
normDataSet = dataSet - tile(minVals,(m,))
normDataSet = normDataSet/tile(range,(m,))
return normDataSet,range,minVals

3. 分类器

  主要是利用测试数据对前面创建的分类器进行验证,测试分类器的效果

 def classify(inX,dataSet,labels,k):
dataSetSize = dataSet.shape[]
diffMat = tile(inX,(dataSetSize,))-dataSet
sqDiffMat = diffMat**
sqDistances = sqDiffMat.sum(axis=)
distances = sqDistances**0.5
sortedDistIndices = distances.argsort()
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndices[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,)+
sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(),reverse=True)
return sortedClassCount[][]

4. 测试

 def datingClassTest():
resultList = ['一点也不喜欢','有一点好感','特别喜欢']
hoRatio = 0.1
filename = 'E:\\datingTestSet2.txt';
(marix,classLabel)=read_file(filename)
normdataSet,ranges,minVals=autoNorm(marix)
m = normdataSet.shape[]
numTestVecs = int(m*hoRatio)
errorCount = 0.0
for i in range(numTestVecs):
classResult = classify(normdataSet[i,:],normdataSet[numTestVecs:m,:],classLabel[numTestVecs:m],)
print "你对这个人的感觉是:%s ,现实情况是:%s" %(resultList[int(classResult-)],resultList[int(classLabel[i]-)])
if classResult != classLabel[i]:
errorCount += 1.0
print "错误率是: %f " %(errorCount/float(numTestVecs))

5. 测试结果

你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:特别喜欢 ,现实情况是:特别喜欢
你对这个人的感觉是:特别喜欢 ,现实情况是:特别喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:特别喜欢 ,现实情况是:特别喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
你对这个人的感觉是:一点也不喜欢 ,现实情况是:一点也不喜欢
...

  所有程序均来自《机器学习实战》,非常好的书籍,推荐大家学习一下......

Python学习之k-近邻实例的更多相关文章

  1. python学习_数据处理编程实例(二)

    在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...

  2. Python学习:类和实例

    Python学习:类和实例 本文作者: 玄魂工作室--热热的蚂蚁 类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规 ...

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

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

  4. 学习笔记——k近邻法

    对新的输入实例,在训练数据集中找到与该实例最邻近的\(k\)个实例,这\(k\)个实例的多数属于某个类,就把该输入实例分给这个类. \(k\) 近邻法(\(k\)-nearest neighbor, ...

  5. spark-机器学习实践-K近邻应用实践一

    K近邻应用-异常检测应用 原理: 根据数据样本进行KMeans机器学习模型的建立,获取簇心点,以簇为单位,离簇心最远的第五个点的距离为阈值,大于这个值的为异常点,即获得数据异常. 如图:

  6. python学习笔记-练手实例

    1.题目:输出 9*9 乘法口诀表.     程序分析:分行与列考虑,共9行9列,i控制行,j控制列     代码: for i in range(1,10): print ('\r') for j ...

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

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

  8. python学习_数据处理编程实例(一)

    目的:用一个实例总结学习到的with语句,函数,列表推导,集合,排序,字符分割等内容 要求:分别以james,julie,mikey,sarah四个学生的名字建立文本文件,分别存储各自的成绩,时间格式 ...

  9. Python学习_11_类和实例

    类和实例 类是对象创建实例的模板,而实例则是对象的实体.类使用class关键字定义: class MyClass:    pass python中创建实例直接使用工厂函数(类名加上一对括号),和其他的 ...

  10. 廖雪峰Python学习笔记——类和实例

    Class MyList(list): __metaclass__ = ListMetaclass #它表示在创建MyList这个类时,必须通过 ListMetaclass这个元类的LIstMetac ...

随机推荐

  1. BusyBox telnet配置

    1.  busybox配置telnet相关命令. 2.  devpts文件系统,是目前最常见的pseudo终端,使用telnetd服务器,必须加载该文件系统. 在/dev目录下创建一个pts目录,用来 ...

  2. R语言中的数据处理包dplyr、tidyr笔记

    R语言中的数据处理包dplyr.tidyr笔记   dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了 ...

  3. CMake 用法导览

    Preface : 本文是CMake官方文档CMake Tutorial (http://www.cmake.org/cmake/help/cmake_tutorial.html) 的翻译.通过一个样 ...

  4. FATAL ERROR: Could not find ./bin/my_print_defaults 解决方法

    FATAL ERROR: Could not find ./bin/my_print_defaults If you compiled from source, you need to run 'ma ...

  5. 10 个强大的JavaScript / jQuery 模板引擎推荐

    模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档.由于在开发过程中,网站或应用程序的界面与数据实现分离,大大提升了开发效率,良好的设计也使得代码重用变得更加容易. 本文 ...

  6. Learning to act by predicting the future

    Dosovitskiy, Alexey, and Vladlen Koltun. "Learning to act by predicting the future." arXiv ...

  7. am335x watchdog

    am335x watchdog 内核文档kernel/Documentation/watchdog Qt@aplex:~/kernel/7109/linux-3.2.0/Documentation/w ...

  8. 第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多、一对一、多对多

    第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多.一对一.多对多 链表操作 链表,就是一张表的外键字段,连接另外一张表的主键字段 一对多 models.Forei ...

  9. 在tomcat下context.xml中配置各种数据库连接池(JNDI)

    1.   首先,需要为数据源配置一个JNDI资源.我们的数据源JNDI资源应该定义在context元素中.在tomcat6版本中,context元素已经从server.xml文件中独立出来了,放在一个 ...

  10. 天线增益英文名称:antenna gain

    天线增益是指:在输入功率相等的条件下,实际天线与理想的辐射单元在空间同一点处所产生的信号的功率密度之比.它定量地描述一个天线把输入功率集中辐射的程度.增益显然与天线方向图有密切的关系,方向图主瓣越窄, ...