简单knn学习

from numpy import *
import operator
from PIL import Image
from os import listdir
def knn(k,testdata,traindata,labels):#labels为类别
#得到训练集的行数,shape 0位行数,1位列数
traindatasize=traindata.shape[0]
#用tile把测试集变为和训练集一样的行数,再求差
dif=tile(testdata,(traindatasize,1))-traindata
#求平方
sqdif=dif2
#求平方和,axis=1行求和,0列相加
sumsqdif=sqdif.sum(axis=1)
#开方得到距离
distance=sumsqdif
0.5
#升序排序,argsort,排序后为下标排序
sortdistance=distance.argsort()
#取前面最小几个,距离最近
count={}
for i in range(0,k):
#计算每个类的分类次数
vote=labels[sortdistance[i]]
count[vote]=count.get(vote,0)+1
#通过排序得出出现最多的类别
sortcount=sorted(count.items(),key=operator.itemgetter(1),reverse=True)#key取count下标1那个数,默认升序,reverse=True为降序
#排序后第一个为出现最多的类别
return sortcount[0][0]

#用pillow图片处理,图片均为32*32
#打开图片
im=Image.open(“E:\基础学习\python学习\knn\EftRFpQ==.jpg”)
#打开一个文本,用于把图片转换成文本
fh=open(“E:\基础学习\python学习\knn\图片.txt”,‘a’)
width=im.size[0]
height=im.size[1]
#获取坐标像素
for i in range(0,width):
for j in range(0,height):
cl=im.getpixel((i,j))
#???
clall=cl[0]+cl[1]+cl[2]
#判断是否为黑像素,RGB:255,255,255为白色,0,0,0为黑色
if(clall==0):
fh.write(“1”)
else:
fh.write(“0”)
fh.write("\n")
fh.close()

#加载数据,把数据写进空列表
def datatoarray(fname):
arr=[]
#打开文件
fh=open(fname)
#读取文本行数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(“E:\基础学习\python学习\knn\E1.txt”)
#取文件名前缀,文件命名为2_523.txt,2为数字
def seplabel(fname):
#取.前面部分
filestr=fname.split(".")[0]
#取_前面部分
label=int(filestr.split("_")[0])
return label
#建立训练数据集,得到训练数据和类别,导入knn
def traindata():
#建立类别
labels=[]
#读取目录全部文件
trainfile=listdir(“E:\基础学习\python学习\knn”)
#获取文件数(行数)
num=len(trainfile)
#1024列,每行储存一个文件,用zeros生成一个数组储存所有训练数据
trainarr=zeros((num,1024))
for i in range(0,num):
#取每个文件
thisfname=trainfile[i]
#取类别
thislabel=seplabel(thisfname)
#写到列表里
labels.append(thislabel)
trainarr[i,:]=datatoarray(“knn/”+thisfname)
return trainarr,labels
#用测试数据调用knn算法,测试能否准确识别
def datatest():
#得到训练集
trainarr,labels=traindata()
#得到测试集
testlist=listdir(“testdata”)
#得到测试总数
tnum=len(testlist)
for i in range(0,tnum):
thistestfile=testlist[i]
#加载为数组
testarr=datatoarray(“testdata/”+thistestfile)
rknn=knn(3,testarr,trainarr,labels)
print(rknn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值