Python实现的knn算法示例
作者:旭旭_哥 发布时间:2022-09-21 14:35:09
标签:Python,knn算法
本文实例讲述了Python实现的knn算法。分享给大家供大家参考,具体如下:
代码参考机器学习实战那本书:
机器学习实战 (Peter Harrington著) 中文版
机器学习实战 (Peter Harrington著) 英文原版[附源代码]
有兴趣你们可以去了解下
具体代码:
# -*- 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()
运行结果如下图:
注:这里使用到了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程序设计有所帮助。
来源:https://blog.csdn.net/luoyexuge/article/details/49104367
0
投稿
猜你喜欢
- 大家好,给大家分享下如何使用Python脚本操作Excel实现批量替换。使用的工具Openpyxl,一个处理excel的python库,处理
- 如下所示: static void Main()&nbs
- 一、单字节SQL注入MYSQL的SQL注入已经由来已久,以下是普遍采用的注入步骤:1、在GET参数上加一个/*或者#(mysql专有的注释)
- 1.安装插件,在非虚拟环境conda install nb_condaconda install ipykernel2、安装ipykerne
- 一个小代码 类似资源管理器效果 支持鼠标拖拽 没写些细节东西 JavaScript语言:
- 技术背景对于一些连续运行或者长时间运行的Python程序而言,如服务器的后端,或者是长时间运行的科学计算程序。当我们涉及到一些中途退出的操作
- 如提取第1行,第2列的值:df.iloc[[0],[1]]则会返回一个df,即有字段名和行号。如果用values属性取值:df.iloc[[
- python提高图像质量概述调研了一些提高图像质量的方式深度学习方法,如微软的Bringing-Old-Photos-Back-to-Lif
- 引言使用python进行接口测试时常常需要接口用例测试数据、断言接口功能、验证接口响应状态等,如果大量的接口测试用例脚本都将接口测试用例数据
- 目录实验环境依赖项安装编程实现浏览器有一个可以用于展示网页的窗口代码总结实验环境操作系统:Linux Mint编辑器:vim编程语言:pyt
- Python中为了方便程序直接生成exe文件,它存在一个pyinstaller库,使用这个库可以直接将.py程序生成exe文件。这个命令不是
- 简介这是一个操作数据库(sqlite3)的项目,用PyQt5进行界面封装。此次项目最主要的是,主界面与子界面的交互,一个主界面与三个子界面交
- 概述先来介绍一下xml格式的文件,从数据分析的角度去看xml格式的数据集,具有以下的优点开放性(能在任何平台上读取和处理数据,允许通过一些网
- 最近发现Python课器做很多事情,在监控服务器有其独特的优势,耗费资源少,开发周期短。首先我们做一个定时或者实时脚本timedtask.p
- 这个网页颜色表是很好用,鼠标点击颜色即可复制颜色值到剪贴板,方便大家设计取色。下载苏昱css2 样式表中文手册包括颜色表:W3C- 十六色色
- 目录一、对比数据类型二、可变集合构造方法三、不可变集合的构造方法四、集合构造注意事项 Python集合又是一种新的数据类型,集合有
- asp三天学好ADO对象之第二天 今天来说一下Recordset对象的一些方法。1、AddNew 方法创建可更新 Recordset 对象的
- python刷CSDN访问量import requestsimport reimport timepayload = ""
- 本文实例讲述了Python获取任意xml节点值的方法。分享给大家供大家参考。具体实现方法如下:# -*- coding: utf-8 -*-
- 对List进行排序,Python提供了两个方法方法1.用List的内建函数list.sort进行排序list.sort(func=None,