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 socket.error: [Errno 98] Address already in use的原因和解决方法
Aug 25 Python
python以环状形式组合排列图片并输出的方法
Mar 17 Python
Python如何判断数独是否合法
Sep 08 Python
Python 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
python3 遍历删除特定后缀名文件的方法
Apr 23 Python
Python for循环生成列表的实例
Jun 15 Python
python DataFrame 取差集实例
Jan 30 Python
Python实现把类当做字典来访问
Dec 16 Python
使用Python发现隐藏的wifi
Mar 04 Python
Python数据结构dict常用操作代码实例
Mar 12 Python
Python之Matplotlib文字与注释的使用方法
Jun 18 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 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
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
一步一步学习PHP(3) php 函数
2010/02/15 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
php登录超时检测功能实例详解
2017/03/21 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
bootstrap实现的自适应页面简单应用示例
2017/03/09 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
Easyui在treegrid添加控件的实现方法
2017/06/23 Javascript
关于js对textarea换行符的处理方法浅析
2018/08/03 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
js实现图片上传即时显示效果
2019/09/30 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
python学生信息管理系统(完整版)
2020/04/05 Python
Python numpy线性代数用法实例解析
2019/11/15 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
Python 解析pymysql模块操作数据库的方法
2020/02/18 Python
酒店管理专业毕业生推荐信
2013/11/10 职场文书
先进班级集体事迹材料
2014/01/30 职场文书
小摄影师教学反思
2014/04/27 职场文书
安全生产月演讲稿
2014/05/09 职场文书
环境整治工作方案
2014/05/18 职场文书
党支部创先争优承诺书
2014/08/30 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书
2015年九一八事变纪念活动实施方案
2015/05/06 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书