# 用kNN算法识别手写数字，归一化对准确率的影响？

PenguinGoHack
• 227

``````# 归一化，把所有不为1的值化为1
def nomalizing(array):
m,n=shape(array)
for i in xrange(m):
for j in xrange(n):
if array[i,j]!=0:
array[i,j]=1
return array``````

``````# -*- coding: utf-8 -*-
import numpy as np
import _csv as csv
import operator

# path 文件路径
# rowNum 可指定取数据集中特定数量向量
# 将图片转换为向量矩阵，返回数据集、类别
def loadTrainingData(path, rowNum = -1):
rawData = []
with open(path) as file:
for line in lines:
rawData.append(line)

# 去除pixel行
rawData.remove(rawData[0])

dataSet = rawData[0:rowNum]
# dataSet = map(int, dataSet)
dataSet = np.array(dataSet)
labels = dataSet[:,0]

dataSet = dataSet[:,1:]
dataSet = dataSet.astype(int)
# print np.shape(dataSet)
resultSet = dataSet
return resultSet, labels

rawData = []
with open(path) as file:
for line in lines:
rawData.append(line)
# 去除pixel行
rawData.remove(rawData[0])

dataSet = np.array(rawData)
dataSet = dataSet.astype(int)
resultSet = dataSet
return resultSet

# knn算法分类器
# inX 所要测试的向量
# dataSet 训练样本集
# labels 标签向量
# k 所选的最邻近数目
def knnClassifier(inX, dataSet, labels, k):
# 矩阵化
inX = np.mat(inX)
dataSet = np.mat(dataSet)
labels = np.mat(labels)

dataSetSize = dataSet.shape[0]

# 计算与每个样本的差值
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
# 求欧式距离
sqDiffMat = np.array(diffMat)**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
# 得到以距离排序的索引列表，距离由近到远
sortedDistIndicies = distances.argsort()
#得到类别:个数的字典
classCount={}
for i in range(k):
voteIlabel = labels[0,sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]``````

1 个回答

`array`里面存储的是什么？像素值么？

`kNN`不是一种很有竞争力的算法，它利用的还是裸的像素值来做图像表示。

###### 你尚未登录，登录后可以
• 和开发者交流问题的细节
• 关注并接收问题和回答的更新提醒
• 参与内容的编辑和改进，让解决方法与时俱进