- 首先明确需求并对数据进行观察
- 其次,确定算法
- 确定步骤
- 编程实现
常见的分类算法
- KNN算法
- 贝克斯方法
- 决策树
- 人工神经网络
- 支持向量机(SVM)
KNN算法
实现步骤
- 处理数据
- 数据向量化
- 计算欧几里得距离
- 根据距离进行分类
手写体数字识别
训练数据
测试数据
pillow模块处理图片
os.listdir(path)
获取某个文件夹下的所有文件名
from PIL import Image
from numpy import *
import operator
from os import listdir, path
BASE_DIR = path.dirname(path.abspath(__file__))
def knn(k, testdata, traindata, labels):
# 取训练数据的行数
traindata_size = traindata.shape[0]
# 将测试数据扩展为与训练数据相同维数
# 从行方向扩展 numpy.tile(a, (size, 1))
# 得到差值
diff = tile(testdata, (traindata_size, 1)) - traindata
sqdiff = array(diff**2)
# 每一行的各列求和
sumsqdiff = sqdiff.sum(axis=1)
# 开方,得到距离
distance = sumsqdiff**0.5
# 对元素进行排序
sortdistance = distance.argsort()
# 取前k个数据
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)
return sortcount[0][0]
# 图片处理
# 先将所有图片处理成固定宽高,比如32*32,然后再转换为文本
img = Image.open(
path.join(BASE_DIR, 'img', 'zx.png'))
# 保存图片
# img.save('C:/py/mp4/010.Python爬虫数据分析视频教程项目实战(整套原价899)/数据分析/knn/img/zx2.png')
# 图片的长宽信息
w = img.size[0]
h = img.size[1]
# print(img.size)
# 获取指定像素颜色
# k = img.getpixel((5, 9))
# print(k)
with open(path.join(BASE_DIR, 'img', 'zxx.png'), 'a', encoding='utf-8') as f:
for i in range(0, w):
for j in range(0, h):
cl = img.getpixel((i, j))
clall = cl[0] + cl[1] + cl[2]
if clall == 0: # 黑色
f.write('1')
else: # 白色
f.write('0')
f.write('\n')
# 加载数据
def data2array(fname):
arr = []
with open(fname, 'r', encoding='utf-8') as f:
for i in range(0, 32):
thisline = f.readline()
for j in range(0, 32):
arr.append(int(thisline[j]))
return arr
arr1 = data2array(
path.join(BASE_DIR, 'traindata', '0_4.txt'))
# print(arr1)
# 取文件前缀
def seplabel(fname):
return int(fname.split('_')[0])
# 建立训练数据
def traindata():
labels = []
trainfile = listdir(
path.join(BASE_DIR, 'traindata'))
num = len(trainfile)
# 行的长度1024(列),每一行存储一个文件
# 用一个数组存储所有训练数据,行文件总数,列1024
# numpy.zeros(m, n)生成m行,n列的数组
trainarr = zeros((num, 1024))
for i in range(0, num):
thisfname = trainfile[i]
thislabel = seplabel(thisfname)
labels.append(thislabel)
trainarr[i,:] = data2array(path.join(BASE_DIR, 'traindata', thisfname))
return trainarr, labels
# 用测试数据调用KNN算法去测试,看是否能够准确识别
def datatest():
trainarr, labels = traindata()
testlist = listdir(path.join(BASE_DIR, 'testdata'))
tnum = len(testlist)
for i in range(0, tnum):
testfile = testlist[i]
testarr = data2array(path.join(BASE_DIR, 'testdata', testfile))
rknn = knn(3, testarr, trainarr, labels)
print(rknn)
datatest()