海伦收集约会数据巳经有了一段时间,她把这些数据存放在文本文件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. skynet1.0阅读笔记2_skynet的消息投递skynet.call

    为了了解 skynet.call 的调用过程,需要先看看 skynet的队列是如何把包分到不同工作线程的.看下图 查看 global_queue 的skynet_globalmq_push和skyne ...

  2. UC浏览器调试移动端网站

    准备工作: UC浏览器开发版网址 UC浏览器开发者版下载地址 下载adb_tool 步骤: 1.将adb_tool解压,把里面的文件复制到 C:\Windows\SysWOW64 文件夹下面. 2.运 ...

  3. tp-02 四种url访问的方式

    :http://localhost/index.php?m=模块&c=控制器&a=操作方法 [get模式] :http://localhost/index.php/模块[模块文件夹]/ ...

  4. 关于Struts2的jsp页面的注释

    语句就算用<!-- -->注释后,还是会在编译的时候显示在网页上,而且网页还会报错,因为注释的那些语句也会去编译,也会去检查有没有错误,所以一些注释掉的过时的变量和方法也会导致报错.500

  5. [转载]如何解决failed to push some refs to git

    Administrator@PC-20150110FGWU /K/cocos2d/yc (master) $ git push -u origin master To git@github.com:y ...

  6. window,centos双系统坏了

    在centos中格式化SD卡的时候,操作错误,误将windows系统C盘的给格式化了.C盘是ntf格式的,现在却变为了fat32的格式. 重启系统,发现还是可以进入到centos,但是window进入 ...

  7. perl File::Spec 模块

    File::Spec 模块提供了很多的功能,这里只列举几个常用的函数 rel2abs : 返回一个文件的绝对路径, 常见用法,返回当前运行的perl脚本的绝对路径 代码示例: my $prog = F ...

  8. 使用PHP生成和获取XML格式数据

    1.php生成xml

  9. sqlldr导入数据(以PostgreSql>>>Oracle为例)

    1.在目标数据库中创建表 1.1点击源表,复制创建语句 1.2 修改数据类型以匹配目标数据库,如: 字符串类型:character varying(20)>>>varchar2(20 ...

  10. 怎么输入MathType不等号

    MathType是一款比较常用的数学公式编辑器,我们在使用这款软件的时候常常需要输入各种符号.有些新用户对这款软件不是很熟悉,对于一些符号不知道怎么输入,下面我们来给大家介绍介绍MathType不等号 ...