Python简单实现KNN算法
__author__ = '糖衣豆豆'
from numpy import *
from os import listdir
import operator
#从列方向扩展
#tile(a,(size,1))
#实现KNN算法,需要指定k,需要测试数据集,需要训练数据集,类别名(标签),
def knn(k,testdata,traindata,labels):
#通过shape获得行数
traindatasize=traindata.shape[0]
#扩展testdata的维数,tile函数可以扩展testdata和traindata相同的行数,然后和traindata的向量相减计算测试机和训练集的差值
dif=tile(testdata,(traindatasize,1))-traindata
#计算差值的平方
sqdif=dif**2
#计算平方和,每一行的各列求和,axis=1每一行的各列求和
sumsqdif=sqdif.sum(axis=1)
#开方
distance=sumsqdif**0.5
#排序
sortdistance=distance.argsort()
#空字典
count={}
#选择距离最短的k
for i in range(0,k):
#获取类别,下标决定属于哪一类
vote=labels[sortdistance[i]]
#整理为一定格式,得到类别vote,每出现一次统计一次
count[vote]=count.get(vote,0)+1
#取出最多的类别,reverse=True表示降序
sortcount=sorted(count.items(),key=operator.itemgetter(1),reverse=True)
return sortcount[0][0] #图片处理
#先将图片转为固定宽高,比如32*32,然后再转为文本
'''
from PIL import Image
im=Image.open("~/Downloads/123.png")
fh=open("~/Downloads/123_txt","a")
width=im.size[0]
height=im.size[1]
#k=im.getpixel((1,9))
#print(k)
for i in range(0,width):
for j in range(0,height):
cl=im.getpixel((i,j))
clall=cl[0]+cl[1]+cl[2]
if(clall==0):
#黑色
fh.write("1")
else:
fh.write("0")
fh.write("\n")
fh.close()
''' #加载数据
#将数据转为数组
def datatoarray(fname):
arr=[]
fh=open(fname)
#图片是32*32的横轴每次读取32
for i in range(0,32):
thisline=fh.readline()
#读每一行
for j in range(0,32):
#读入到数组里
arr.append(int(thisline[j]))
return arr
arr1=datatoarray("~/coding/python/data/testandtraindata/testdata/0_74.txt")
#print(arr1)
#建立一个函数,取文件的前缀
def seplabel(fname):
filestr=fname.split(".")[0]
label=int(filestr.split("_")[0])
return label
#建立训练数据
def traindata():
#存储类别
labels=[]
#得到训练目录下所有的文件
trainfile=listdir("~/coding/python/data/testandtraindata/traindata")
#取当前文件有多少个
num=len(trainfile)
#生成一个多少行多少列的向量,行的长度应该是32*32=1024(列),每一行存储一个文件
#用一个数组存储所有训练数据,行:文件总数,列:1024
trainarr=zeros((num,1024))
#第一层循环文件
for i in range(0,num):
thisfname=trainfile[i]
#调用seplabel函数
thislabel=seplabel(thisfname)
#存到数组里
labels.append(thislabel)
#调用datatoarray函数,i,:处理重复读取
trainarr[i,:]=datatoarray("~/coding/python/data/testandtraindata/traindata/"+thisfname)
return trainarr,labels
#用测试数据条用KNN算法去测试,看是否能够准确识别
def datatest():
trainarr,labels=traindata()
testlist=listdir("~/coding/python/data/testandtraindata/testdata")
tnum=len(testlist)
for i in range(0,tnum):
thistestfile=testlist[i]
testarr=datatoarray("~/coding/python/data/testandtraindata/testdata/"+thistestfile)
rknn=knn(3,testarr,trainarr,labels)
print(rknn)
#a=datatest()
#print(a)
#抽某一个文件测试文件出来进行验证
trainarr,labels=traindata()
thistestfile="8_15.txt"
testarr=datatoarray("~/coding/python/data/testandtraindata/testdata/"+thistestfile)
rknn=knn(3,testarr,trainarr,labels)
print(rknn)
Python简单实现KNN算法的更多相关文章
- 使用python模拟实现KNN算法
一.KNN简介 1.KNN算法也称为K邻近算法,是数据挖掘分类技术之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表. 2.KNN算法的核心思想是如果一个样本 ...
- python最近邻分类器KNN算法
1. KNN算法 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最 ...
- python 实现简单的KNN算法
from numpy import * import operator def createDataSet(): group = array([[3,104],[2,100],[1,81],[101, ...
- python实现简单分类knn算法
原理:计算当前点(无label,一般为测试集)和其他每个点(有label,一般为训练集)的距离并升序排序,选取k个最小距离的点,根据这k个点对应的类别进行投票,票数最多的类别的即为该点所对应的类别.代 ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- 算法代码[置顶] 机器学习实战之KNN算法详解
改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了 前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用的匹配技 ...
- 运用kNN算法识别潜在续费商家
背景与目标 Youzan 是一家SAAS公司,服务于数百万商家,帮助互联网时代的生意人私有化顾客资产.拓展互联网客群.提高经营效率.现在,该公司希望能够从商家的交易数据中,挖掘出有强烈续费倾向的商家, ...
- 人工智能之KNN算法
转载自:https://www.cnblogs.com/magic-girl/p/python-kNN.html 基于python实现的KNN算法 邻近算法(k-NearestNeighbor) 是机 ...
- KNN算法java实现代码注释
K近邻算法思想非常简单,总结起来就是根据某种距离度量检测未知数据与已知数据的距离,统计其中距离最近的k个已知数据的类别,以多数投票的形式确定未知数据的类别. 一直想自己实现knn的java实现,但限于 ...
随机推荐
- turtlebot3安装遇到的问题总结
turtlebot3安装遇到的问题总结 问题如下 1.ubuntu mate 开机启动 开始试了很多方法都不行,注意不要输错用户名,不然进不了系统了(进不了解决方法,找个电脑读一下这个turtlebo ...
- linux c tcp p2p
江湖上一直都有这位哥哥的传说,也有很多人说自己就他的真身! 但是... 今天分享一下TCP连接的P2P demo,江湖的规矩也要与时俱进... ———————————————————————————— ...
- 自己写的一些公共js方法
/* 说明文件:这里用的都是es6的语法 导入导出,拿vue举个栗子,你只需要在用到的地方,按需要导入就行了,然后在mounted中直接可以拿来用 比如下面的手机****方法,在需要用到的地方impo ...
- Python练习:含参数的脚本示例
首先准备一个example.csv文件,如下: 编写脚本test.py ,实现传入参数,读取example.csv文件,并将其保存为另一个文件, # 含参数的脚本,读取一个文件,并另保存一个文件im ...
- 重谈react优势——react技术栈回顾
react刚刚推出的时候,讲react优势搜索结果是几十页. 现在,react已经慢慢退火,该用用react技术栈的已经使用上,填过多少坑,加过多少班,血泪控诉也不下千文. 今天,再谈一遍react优 ...
- Java输出流FileOutputStream使用详解
Java输出流FileOutputStream使用详解 http://baijiahao.baidu.com/s?id=1600984799323133994&wfr=spider&f ...
- 【转】jenkins+gitlab配置遇到问题
搭建jenkins+gitlab拉取代码失败,日志如下: ERROR: Error fetching remote repo 'origin'hudson.plugins.git.GitExcepti ...
- angularjs简单介绍和特点
首先angular是一个mvc框架, 使用mvc解耦, 采用model, controller以及view的方式去组织代码, 会将一个html页面分成若干个模块, 每个模块都有自己的scope, se ...
- Mysql复制一个数据库到另一个数据库
mysqldump -u root -p source_db > /home/db_bak.sql #导出数据库 123456 #输入数据库密码 扩展: mysqldump -u root -p ...
- Win10环境下 HTTP 错误 500.19 - Internal Server Error 问题及其解决方法
记一下今日份小bug... 明天要做软件架构实验了,今天打算测试下运行web项目,于是乎,找出了以前用JSP写的web项目测试运行不了,我再打开浏览器测试Tomcat服务器,在地址栏键入http:// ...