Python数据分类实现过程

  • 首先明确需求并对数据进行观察
  • 其次,确定算法
  • 确定步骤
  • 编程实现

常见的分类算法

  • 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()


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值