Python实现的knn算法示例


Posted in Python onJune 14, 2018

本文实例讲述了Python实现的knn算法。分享给大家供大家参考,具体如下:

代码参考机器学习实战那本书:

有兴趣你们可以去了解下

具体代码:

# -*- coding:utf-8 -*-
#! python2
'''''
@author:zhoumeixu
createdate:2015年8月27日
'''
#np.zeros((4,2))
#np.zeros(8).reshape(4,2)
#x=np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) np.zeros_like(x)
# 最值和排序:最值有np.max(),np.min() 他们都有axis和out(输出)参数,
# 而通过np.argmax(), np.argmin()可以得到取得最大或最小值时的 下标。
# 排序通过np.sort(), 而np.argsort()得到的是排序后的数据原来位置的下标
# 简单实现knn算法的基本思路
import numpy as np
import operator #运算符操作包
from _ctypes import Array
from statsmodels.sandbox.regression.kernridgeregress_class import plt_closeall
def createDataSet():
 group=np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
 labels=['A','A','B','B']
 return group ,labels
group,labels=createDataSet()
def classify0(inx,dataSet,labels,k):
 dataSetSize=dataSet.shape[0]
 diffMat=np.tile(inx,(dataSetSize,1))-dataSet
 sqDiffMat=diffMat**2
 sqDistances=sqDiffMat.sum(axis=1)
 distances=sqDistances**0.5   #计算距离 python中会自动广播的形式
 sortedDistIndicies=distances.argsort() #排序,得到原来数据的在原来所在的下标
 classCount={}
 for i in range(k):
  voteIlabel=labels[sortedDistIndicies[i]] # 计算距离最近的值所在label标签
  classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 # 计算距离最近的值所在label标签,对前k哥最近数据进行累加
 sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) #排序得到距离k个最近的数所在的标签
 return sortedClassCount[0][0]
if __name__=='__main__':
 print(classify0([0,0],group,labels,4))
# 利用knn算法改进约会网站的配对效果
def file2matrix(filename):
 fr=open(filename)
 arrayOLines=fr.readlines()
 numberOfLines=len(arrayOLines)
 returnMat=np.zeros((numberOfLines,3))
 classLabelVector=[]
 index=0
 for line in arrayOLines:
  line=line.strip()
  listFromLine=line.split('\t')
  returnMat[index,:]=listFromLine[0:3]
  classLabelVector.append(int(listFromLine[-1]))
  index+=1
 return returnMat ,classLabelVector #生成训练数据的array和目标array
path=u'D:\\Users\\zhoumeixu204\\Desktop\\python语言机器学习\\机器学习实战代码 python\\机器学习实战代码\\machinelearninginaction\\Ch02\\'
datingDataMat,datingLabels=file2matrix(path+'datingTestSet2.txt')
import matplotlib
import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(datingDataMat[:,1],datingDataMat[:,2])
plt.show()
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*np.array(datingLabels),15*np.array(datingDataMat[:,2]))
plt.show()  #生成训练数据的array和目标array
def autoNorm(dataset):
 minVals=dataset.min(0)
 maxVals=dataset.max(0)
 ranges=maxVals-minVals
 normeDataSet=np.zeros(np.shape(dataset))
 m=dataset.shape[0]
 normDataSet=dataset-np.tile(minVals,(m,1))
 normDataSet=normDataSet/np.tile(ranges,(m,1))
 return normDataSet ,ranges,minVals
normMat,ranges,minVals=autoNorm(datingDataMat)
def datingClassTest():
 hoRatio=0.1
 datingDataMat,datingLabels=file2matrix(path+'datingTestSet2.txt')
 normMat,ranges,minVals=autoNorm(datingDataMat)
 m=normMat.shape[0]
 numTestVecs=int(m*hoRatio)
 errorCount=0.0
 for i in range(numTestVecs):
  classifierResult=classify0(normMat[i,:], normMat[numTestVecs:m,:], datingLabels[numTestVecs:m],3)
  print "the classifier came back with :%d,the real answer is :%d"\
     %(classifierResult,datingLabels[i])
  if classifierResult!=datingLabels[i]:
   errorCount+=1.0
 print "the total error rare is :%f"%(errorCount/float(numTestVecs)) #利用knn算法测试错误率
if __name__=='__main__':
 datingClassTest()
#利用构建好的模型进行预测
def classifyPerson():
 resultList=['not at all','in same doses','in large d oses']
 percentTats=float(raw_input("percentage if time spent playin cideo games:"))
 ffMiles=float(raw_input("frequnet fliter miles earned per year:"))
 iceCream=float(raw_input("liters of ice cream consumed per year:"))
 datingDataMat,datingLabels=file2matrix(path+'datingTestSet2.txt')
 normMat,ranges,minVals=autoNorm(datingDataMat)
 inArr=np.array([ffMiles,percentTats,iceCream])
 classifierResult=classify0((inArr-minVals)/ranges,normMat,datingLabels,3)
 print("you will probably like the person:",resultList[classifierResult-1])
if __name__!='__main__':
 classifyPerson()
#利用knn算法进行手写识别系统验证
path=u'D:\\Users\\zhoumeixu204\\Desktop\\python语言机器学习\\机器学习实战代码 python\\机器学习实战代码\\machinelearninginaction\\Ch02\\'
def img2vector(filename):
 returnVect=np.zeros((1,1024))
 fr=open(filename)
 for i in range(32):
  lineStr=fr.readline()
  for j in range(32):
   returnVect[0,32*i+j]=int(lineStr[j])
 return returnVect
testVector=img2vector(path+'testDigits\\0_13.txt')
print(testVector[0,0:31])
import os
def handwritingClassTest():
 hwLabels=[]
 trainingFileList=os.listdir(path+'trainingDigits')
 m=len(trainingFileList)
 trainingMat=np.zeros((m,1024))
 for i in range(m):
  fileNameStr=trainingFileList[i]
  fileStr=fileNameStr.split('.')[0]
  classNumStr=int(fileStr.split('_')[0])
  hwLabels.append(classNumStr)
  trainingMat[i,:]=img2vector(path+'trainingDigits\\'+fileNameStr)
 testFileList=os.listdir(path+'testDigits')
 errorCount=0.0
 mTest=len(testFileList)
 for j in range(mTest):
  fileNameStr=testFileList[j]
  fileStr=fileNameStr.split('.')[0]
  classNumStr=int(fileNameStr.split('_')[0])
  classNumStr=int(fileStr.split('_')[0])
  vectorUnderTest=img2vector(path+'testDigits\\'+fileNameStr)
  classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)
  print("the classifier canme back with:%d,the real answer is :%d"%(classifierResult,classNumStr))
  if classifierResult!=classNumStr:
   errorCount+=1.0
 print("\nthe total number of errors is :%d"%errorCount)
 print("\n the total error rate is :%f"%(errorCount/float(mTest)))
if __name__=='__main__':
 handwritingClassTest()

运行结果如下图:

 Python实现的knn算法示例

注:这里使用到了statsmodels模块,可以点击此处本站下载statsmodels安装模块,再进入statsmodels模块所在目录位置,使用:

pip install statsmodels-0.9.0-cp27-none-win32.whl

进行statsmodels模块的安装

同理,出现ImportError: No module named pandas错误提示时,点击此处本站下载pandas模块,再使用

pip install pandas-0.23.1-cp27-none-win32.whl

进行pandas模块的安装

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
用Python写的图片蜘蛛人代码
Aug 27 Python
Python3.x版本中新的字符串格式化方法
Apr 24 Python
详解Python装饰器由浅入深
Dec 09 Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 Python
对Pycharm创建py文件时自定义头部模板的方法详解
Feb 12 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
Aug 08 Python
详解django中Template语言
Feb 22 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
python 5个顶级异步框架推荐
Sep 09 Python
Python中return函数返回值实例用法
Nov 19 Python
Python基础之数据结构详解
Apr 28 Python
使用python向MongoDB插入时间字段的操作
May 18 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 #Python
Tensorflow 查看变量的值方法
Jun 14 #Python
对Tensorflow中权值和feature map的可视化详解
Jun 14 #Python
TensorFlow的权值更新方法
Jun 14 #Python
python字符串常用方法
Jun 14 #Python
tensorflow 输出权重到csv或txt的实例
Jun 14 #Python
修复 Django migration 时遇到的问题解决
Jun 14 #Python
You might like
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
hadoop中一些常用的命令介绍
2013/06/19 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
2014/01/31 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
ExtJS[Desktop]实现图标换行示例代码
2013/11/17 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
AngularJS基础 ng-readonly 指令简单示例
2016/08/02 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
js获取ip和地区
2017/03/10 Javascript
jquery中关于bind()方法的使用技巧分享
2017/03/30 jQuery
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
详解vue后台系统登录态管理
2019/04/02 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
vue 获取及修改store.js里的公共变量实例
2019/11/06 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
python:动态路由的Flask程序代码
2019/11/22 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
区分python中的进程与线程
2020/08/13 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
详解Scrapy Redis入门实战
2020/11/18 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
电子商务专业个人的自我评价
2013/11/19 职场文书
商场促销活动方案
2014/02/08 职场文书
工程类专业自荐信范文
2014/03/09 职场文书
情况说明书格式范文
2014/05/06 职场文书
家庭困难证明
2014/10/12 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
有趣的二维码:使用MyQR和qrcode来制作二维码
2021/05/10 Python
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server