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实现远程调用MetaSploit的方法
Aug 22 Python
浅谈python 读excel数值为浮点型的问题
Dec 25 Python
python UDP(udp)协议发送和接收的实例
Jul 22 Python
对python while循环和双重循环的实例详解
Aug 23 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
python递归下载文件夹下所有文件
Aug 31 Python
Python获取时间戳代码实例
Sep 24 Python
Python终端输出彩色字符方法详解
Feb 11 Python
appium+python adb常用命令分享
Mar 06 Python
使用python实现CGI环境搭建过程解析
Apr 28 Python
基于python调用jenkins-cli实现快速发布
Aug 14 Python
pygame面向对象的飞行小鸟实现(Flappy bird)
Apr 01 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
制作美丽的拉花
2021/03/03 冲泡冲煮
php下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
php 破解防盗链图片函数
2008/12/09 PHP
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
PHP 数组黑名单/白名单实例代码详解
2019/06/04 PHP
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
vuejs前后端数据交互之从后端请求数据的实例
2018/08/11 Javascript
微信小程序常见页面跳转操作简单示例
2019/05/01 Javascript
JS实现简单贪吃蛇小游戏
2020/10/28 Javascript
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
Django中传递参数到URLconf的视图函数中的方法
2015/07/18 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
2018/06/05 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
python实现停车管理系统
2018/11/30 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
Python中如何添加自定义模块
2020/06/09 Python
G-Form护具官方网站:美国运动保护装备
2019/09/04 全球购物
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
关键字final的用法
2013/10/02 面试题
小学数学教研活动总结
2014/07/01 职场文书
我的1919观后感
2015/06/03 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书
如何解决springcloud feign 首次调用100%失败的问题
2021/06/23 Java/Android
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL