海伦收集约会数据巳经有了一段时间,她把这些数据存放在文本文件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. shell脚本----if(数字条件,字符串条件,字符串为空)

    二元比较操作符,比较变量或者比较数字. 注意数字与字符串的区别. 1.整数比较  -eq 等于,如:if [ "$a" -eq "$b" ] -ne 不等于,如 ...

  2. hadoop 1.1.2和 hive 0.10 和hbase 0.94.9整合

    今天弄了一下hive0.10和hbase0.94.9整合,需要设置的并不多,但是也遇到了一些问题. 1.复制jar包 拷贝hbase-0.94.9.jar,zookeeper-3.4.5.jar,pr ...

  3. 超多的CSS3圆角渐变网页按钮

    <!DOCTYPE html><head><title>超多的CSS3圆角渐变按钮</title><style type="text/c ...

  4. java.lang.UnsatisfiedLinkError: No implementation found for int com.xxx.xx中的couldn’t find “XX.so”或loadLibrary("xxx")失败

    我觉得这是个神坑,虽然早几年网上就很多po出来的解决方式,但是同样的问题,我的bug却稳如泰山,一点用都没有,好气 下面总结一下 这里前面先是有个系统打印信息 I/System.out: loadLi ...

  5. r语言 包说明

    [在实际工作中,每个数据科学项目各不相同,但基本都遵循一定的通用流程.具体如下]   [下面列出每个步骤最有用的一些R包] 1.数据导入以下R包主要用于数据导入和保存数据:feather:一种快速,轻 ...

  6. 也谈谈js的压缩,jquery压缩。【转】

    问题缘由: 负责公司的开发平台研发工作,考虑的知识产权的保护工作,必须要考虑java的加密技术和js脚本的加密技术.在目前java加密很容易破解的情况下,还是先搞定js的加密和压缩,一方面可以提高页面 ...

  7. android assets与 assets与res/raw 的相同、不同点

    1.获取资源的输入流 资源文件 sample.txt 位于 $PROJECT_HOME/assets/ 目录下,可以在 Activity 中通过   //也可以放置图片等资源,获取方式相同 Conte ...

  8. JavaScript 杂乱的小总结

    基本类型只有String.number.boolean.null.undefined,还有一个Object.存在装箱类型,不过后台自动转换. 通过new创建对象时,如果没有参数,可以省略“()”.-- ...

  9. 对于表达式比较长的 for 语句和 if 语句

    对于表达式比较长的 for 语句和 if 语句,为了紧凑起见可以适当地去 掉一些空格,如 for (i=0; i<10; i++)和 if ((a<=b) && (c< ...

  10. Spring-更多DI的知识

    3.3.1 延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean. 配置方式很简单只需在<bean>标签上指定 “lazy-i ...