1、图像处理0-1
from PIL import Image
im=Image.open("E:\AWorkStation01\数据挖掘\codes\identity.jpg") #读取本地文件
fh=open("E:/AWorkStation01/数据挖掘/codes/result.txt","a") #打开写入的txt文件
width=im.size[0] #获取图像信息
height=im.size[1]
for i in range(0, width):
for j in range(0, height):
cl = im.getpixel((j, i)) #获取像素点
cl_rgb = cl[0] + cl[1] + cl[2] #rgb值相加
if (cl_rgb <400):
fh.write("1")
else:
fh.write("0")
fh.write("\n")
fh.close() #关闭文件
结果:
2、手写体数字识别
数据训练集链接: https://pan.baidu.com/s/1l6ZS1qieYKiqJuSESj5zEw 提取码: my96
from numpy import *
from os import listdir
lists1=listdir("E:\\AWorkStation01\\数据挖掘\\codes") #读取当前路径文件夹中所有的文件,可用用来读取训练数据集合
b.sum(axis=0) #每一行各列求和
b.sum(axis=1) #每一列各行求和
c=array([12,2,7,9])
c.argsort()
array([1,2,3,0]) #得到的结果是原数组从小到大数排列的下标
def knn(k,testdata,traindata,labels): #k表示取的个数、labels
traindatasize=traindata.shape[0] #shape用来取规格 [n,m] n表示行m表示列
dif = tile(testdata,(traindatasize,1)).astype(int32)-traindata #测试的数据可能与训练集规格不一样要进行拓展 dif最终求的是差值
#tile(testdata,(n,m)) n表示行拓展次数、m表示列拓展次数
sqdif = dif**2 #dif是一个矩阵 矩阵相乘得到一个新的矩阵
sumsqdif= sqdif.sum(axis=1) #axis=1按行运算
distance=sumsqdif**0.5 #开方
sortdistance = distance.argsort() #按大小排序(排序的是元素的下标而不是元素本身)
count={} #空字典
for i in range(0,k):
vote=labels[sortdistance[i]] #找出前top(k)小元素的下标
count[vote]=count.get(vote,0)+1
# sortcount=sorted(count.items(),key = operator.itemgetter(1),reverse = True)
# return sortcount[0][0]
return count
#加载数据
def datatoarray(fname):
arr=[]
fh=open(fname, encoding='utf-8') #打开文本
for i in range(0,32):
thisline=fh.readline() #读取每一行一共32行 (32视具体情况而定)
for j in range(0,32):
arr.append(thisline[j]) #将该行中的元素逐渐加入到arr数组中
return arr
arr1 = datatoarray("E:\\AWorkStation01\\数据挖掘\\codes\\result.txt")
#建立一个函数取文件名前缀
def setlabel(fname):
filestr=fname.split(".")[0] #取文件类型前面部分
label=int(filestr.split("_")[0]) #取文件名中"_"前一部分
return label
#建立训练数据
def traindata():
labels=[]
trainfile=listdir("E:\\AWorkStation01\\数据挖掘\\codes\\训练集\\digits\\trainingDigits") #获取文件列表
num = len(trainfile) #文件个数
#假设文件大小为 32*32 每一行存储一个文件长度为1024
#用一个二维数组存储所有训练数据,行:文件总数,列:1024
trainarr = zeros((num, 1024)) # 申请一个 num*1024 的二维数组 前提是要引用numpy库
for i in range(0, num):
thisfname = trainfile[i] # 获取第i个文件名
thislabel=setlabel(thisfname) #获取当前文件所对应的数字
labels.append(thislabel)
trainarr[i,:]=datatoarray("E:\\AWorkStation01\\数据挖掘\\codes\\训练集\\digits\\trainingDigits\\"+thisfname) #将文件夹traindata中的thisfname文件写入到trainarr[i,:]中
return trainarr,labels
#用测试数据调用KNN算法去测试
def datatest():
trainarr,labels = traindata() #获取训练集数据及labels
testlist=listdir("E:\\AWorkStation01\\数据挖掘\\codes\\训练集\\digits\\testDigits") #获取testdata文件夹中的所有测试文件
tnum=len(testlist) #测试组数
for i in range(0,tnum):
thistestfile=testlist[i] #选择当前测试文件
testarr = datatoarray("E:\\AWorkStation01\\数据挖掘\\codes\\训练集\\digits\\testDigits\\"+thistestfile)
result = knn(3,testarr,trainarr,labels) #调用knn算法
print(result)
traindata=traindata()[0]
labels=traindata()[1]
traindatasize=traindata.shape[0]
testdata=datatoarray("E:\\AWorkStation01\\数据挖掘\\codes\\训练集\\digits\\testDigits\\1_28.txt")