### Python使用KNN算法识别手写数字
#### 一、KNN算法原理
K近邻算法(K-Nearest Neighbors, KNN)是一种基于实例的学习方法,它通过测量不同特征值之间的距离来进行分类。在本案例中,我们将利用Python语言实现KNN算法,并将其应用于手写数字的识别任务。
#### 二、准备工作
为了实现KNN算法识别手写数字,我们需要做一些准备工作:
1. **安装依赖库**:确保已经安装了Numpy库,这是Python中用于数值计算的基础库。
```python
pip install numpy
```
2. **数据准备**:数据集通常包含两个部分:训练数据集和测试数据集。训练数据集用来训练模型,而测试数据集则用于评估模型的准确性。在本例中,我们使用MNIST数据集的简化版本,数据格式为32x32的灰度图像。
#### 三、核心函数实现
接下来介绍核心函数的实现过程:
##### 1. `classify` 函数
该函数实现了KNN算法的核心逻辑,其主要步骤如下:
- **计算距离**:首先计算未知数据点与所有已知数据点之间的距离。
- **排序**:根据距离大小进行排序。
- **投票**:选择最近的K个数据点,并统计它们所属类别的出现频次。
- **返回结果**:返回出现次数最多的类别作为最终预测结果。
```python
def classify(inputPoint, dataSet, labels, k):
dataSetSize = dataSet.shape[0] # 获取训练集的行数
diffMat = tile(inputPoint, (dataSetSize, 1)) - dataSet # 计算差值矩阵
sqDiffMat = diffMat**2 # 计算平方差
sqDistances = sqDiffMat.sum(axis=1) # 按行累加
distances = sqDistances**0.5 # 开方得到距离矩阵
sortedDistIndices = distances.argsort() # 对距离进行排序
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndices[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True)
return sortedClassCount[0][0]
```
##### 2. `img2vector` 函数
此函数的作用是从文本文件中读取数据并转换为向量。
```python
def img2vector(filename):
returnVect = []
with open(filename) as fr:
for i in range(32): # 因为每个图片是32x32像素
lineStr = fr.readline()
for j in range(32):
returnVect.append(int(lineStr[j]))
return returnVect
```
##### 3. `classnumCut` 函数
该函数用于从文件名中解析出类别标签。
```python
def classnumCut(fileName):
fileStr = fileName.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
return classNumStr
```
##### 4. `trainingDataSet` 函数
构建训练集数据向量和对应的分类标签向量。
```python
def trainingDataSet():
hwLabels = []
trainingFileList = listdir('trainingDigits')
m = len(trainingFileList)
trainingMat = zeros((m, 1024))
for i in range(m):
fileNameStr = trainingFileList[i]
hwLabels.append(classnumCut(fileNameStr))
trainingMat[i, :] = img2vector('trainingDigits/%s' % fileNameStr)
return hwLabels, trainingMat
```
#### 四、完整流程
1. **加载数据**:使用`trainingDataSet`函数加载训练数据和对应的标签。
2. **训练模型**:由于KNN算法是基于实例的,因此这里不需要显式的“训练”步骤。
3. **测试模型**:加载测试数据,然后逐个预测每个测试数据的分类,并与实际分类比较,计算准确率。
4. **评估模型**:输出准确率等指标来评估模型的效果。
#### 五、总结
通过上述步骤,我们成功地使用Python实现了KNN算法识别手写数字的功能。这种方法简单直观,易于理解和实现,对于初学者来说是一个很好的实践案例。同时,通过对KNN算法的理解和应用,也能帮助加深对机器学习基本概念的认识。