基于KNN模式识别系统的设计与实现代码大全
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于KNN模式识别系统的设计与实现
1.1 题目的主要研究内容
(1)工作的主要描述
本报告设计了基于KNN模式识别系统的设计与实现,使用Pycharm编译平台,采用python程序语言对鸢尾花数据集进行了分类。
设计的KNN模式识别系统能够完成对鸢尾花数据集的分类并评价其分类准确率。
①首先查找相关资料,通过知网、Web of Science、CSDN、知乎等渠道对KNN分类算法进行了学习,了解了KNN算法的原理和实现机制。
②然后根据KNN算法的原理绘制了程序工作流程图,绘制的程序流程图将作为程序编译的参考。
③最后根据分类模型,采用python程序语言编写对应的系统程序,在Pycharm编译器上进行上机操作,完成了KNN算法对鸢尾花数据集的分类。
(2)系统流程图
KNN最邻近分类算法的实现原理:为了判断未知样本的类别,以所有已知类别的样本作为参照,计算未知样本与所有已知样本的距离,从中选取与未知样本距离最近的K个已知样本,根据少数服从多数的投票法则(majority-voting),将未知样本与K个最邻近样本中所属类别占比较多的归为一类。
根据上述原理,本报告设计的分类系统主要有以下流程:
①首先加载鸢尾花数据集,将数据集拆分为训练集和测试集,训练集占比70%,测试集占比30%。
②接着计算待分类样本与已知样本的欧氏距离。
③在计算完欧式距离的基础上,选取与待分类样本距离最近的K个已知样本,需交叉验证确定K值
④最后根据少数服从多数的投票法则,将待分类样本与K个最近邻样本中所属类别占比较多的归为一类。
具体系统程序工作流程图如下所示:
图1 系统工作流程图
1.2 题目研究的工作基础或实验条件
软件环境:IDLE:Pycharm编译器程序语言:python
1.3 数据集描述
(1)数据来源及背景
本设计所使用的数据集是鸢尾花数据集,鸢尾花数据集是模式识别、机器学习等领域里被使用最多的一个数据集了,很多教材用这份数据来做案例,很多工具,包括R、scikit-learn,都会自带这些数据集。
鸢尾花数据集最初由Edgar Anderson 测量得到,而后在著名的统计学家和生物学家R.A Fisher于1936年发表的文章「The use of multiple measurements in taxonomic problems」中被使用,用其作为线性判别分析(Linear Discriminant Analysis)的一个例子,证明分类的统计方法,从此而被众人所知,尤其是在机器学习这个领域。
数据中的两类鸢尾花记录结果是在加拿大加斯帕半岛上,于同一天的同一个时间段,使用相同的测量仪器,在相同的牧场上由同一个人测量出来的。
这是一份有着70年历史的数据,虽然老,但是却很经典,详细数据集可以在UCI数
据库中找到。
(2)数据集详情
鸢尾花数据集共收集了三类鸢尾花,即Setosa鸢尾花、Versicolour鸢尾花和Virginica鸢尾花,每一类鸢尾花收集了50条样本记录,共计150条。
数据集包括4个属性,分别为花萼的长、花萼的宽、花瓣的长和花瓣的宽。
四个属性的单位都是cm,属于数值变量,四个属性均不存在缺失值的情况,以下是各属性的一些统计值如下:
表1 鸢尾花各属性统计值
1.4 特征提取过程描述
KNN模式识别系统的特征提取主要分为计算距离和选取与未知样本距离最近的K个已知样本。
(1)算距离:给定待分类样本,计算它与已分类样本中的每个样本的距离。
通常使用的距离函数有:欧氏距离、余弦距离、汉明距离、曼哈顿距离等,一般选欧氏距离作为距离度量,但是这是只适用于连续变量。
在文本分类这种非连续变量情况下,汉明距离可以用来作为度量。
通常情况下,如果运用一些特殊的算法来计算度量的话,K近邻分类精度可显著提高,如运用大边缘最近邻法或者近邻成分分析法。
以计算二维空间中的A(x1,y1)、B(x2,y2)两点之间的距离为例,欧氏距离计算公式如下:
Euclidean Distance()d=(1)(2)找邻居:圈定与待分类样本距离最近的K个已分类样本,作为待分类样本的近邻。
KNN实际上K这个字母的含义就是要选取的最邻近样本实例的个数,在
scikit-learn中KNN算法的K值是通过n_neighbors 参数来调节的,默认值是5,K值选的太大易引起欠拟合,太小容易过拟合,需交叉验证确定K值。
本设计通过验证,选择K=7。
1.5 分类过程描述
在前面进行欧式距离计算和K值确定的基础上则可以对鸢尾花数据集进行分类,其分类指导思想是”近朱者赤,近墨者黑“,即由未知样本的邻居来推断出对应的类别。
根据这K个近邻中的大部分样本所属的类别来决定待分类样本该属于哪个分类。
例如在7个近邻样本中,有3个Setosa鸢尾花类、2个Versicolour鸢尾花类和2个Virginica鸢尾花类,根据少数服从多数的投票法则,将未知样本则归为Setosa鸢尾花类。
1.6 主要程序代码
import math
import csv
import operator
import random
import numpy as np
from sklearn.datasets import make_blobs
#导入所需库函数
# 生成样本数据集samples(样本数量) features(特征向量的维度) centers(类别个数)
def createDataSet(samples=100, features=2, centers=2):
return make_blobs(n_samples=samples, n_features=features, centers=centers, cluster_std=1.0, random_state=8)
# 加载鸢尾花卉数据集filename(数据集文件存放路径)
def loadIrisDataset(filename):
with open(filename, 'rt') as csvfile:
lines = csv.reader(csvfile)
dataset = list(lines)
for x in range(len(dataset)):
for y in range(4):
dataset[x][y] = float(dataset[x][y])
return dataset
# 拆分数据集dataset(要拆分的数据集) split(训练集所占比例) trainingSet(训练集) testSet(测试集)
def splitDataSet(dataSet, split, trainingSet=[], testSet=[]):
for x in range(len(dataSet)):
if random.random() <= split:
trainingSet.append(dataSet[x])
else:
testSet.append(dataSet[x])
# 计算欧氏距离
def euclideanDistance(instance1, instance2, length):
distance = 0
for x in range(length):
distance += pow((instance1[x] - instance2[x]), 2)
return math.sqrt(distance)
# 选取距离最近的K个实例
def getNeighbors(trainingSet, testInstance, k):
distances = []
length = len(testInstance) - 1
for x in range(len(trainingSet)):
dist = euclideanDistance(testInstance, trainingSet[x], length)
distances.append((trainingSet[x], dist))
distances.sort(key=operator.itemgetter(1))
neighbors = []
for x in range(k):
neighbors.append(distances[x][0])
return neighbors
# 获取距离最近的K个实例中占比例较大的分类
def getResponse(neighbors):
classVotes = {}
for x in range(len(neighbors)):
response = neighbors[x][-1]
if response in classVotes:
classV otes[response] += 1
else:
classV otes[response] = 1
sortedVotes = sorted(classV otes.items(), key=operator.itemgetter(1), reverse=True)
return sortedV otes[0][0]
# 计算准确率
def getAccuracy(testSet, predictions):
correct = 0
for x in range(len(testSet)):
if testSet[x][-1] == predictions[x]:
correct += 1
return (correct / float(len(testSet))) * 100.0
def main():
# 使用鸢尾花卉数据集进行分类
dataSet = loadIrisDataset(r'C:\DevTolls\eclipse-pureh2b\python\DeepLearning\KNN\iris_dataset.txt')
print(dataSet)
trainingSet = []
testSet = []
splitDataSet(dataSet, 0.75, trainingSet, testSet)
print('Train set:' + repr(len(trainingSet)))
print('Test set:' + repr(len(testSet)))
predictions = []
k = 7
for x in range(len(testSet)):
neighbors = getNeighbors(trainingSet, testSet[x], k)
result = getResponse(neighbors)
predictions.append(result)
print('>predicted=' + repr(result) + ',actual=' + repr(testSet[x][-1])) accuracy = getAccuracy(testSet, predictions)
print('Accuracy: ' + repr(accuracy) + '%')
main()
1.7 运行结果及分析
图2 运行结果
图2是测试集所展示的分类结果,分类准确率可达93%,绝大部分的测试集数据都能被准确分类,只要极少部分被错误分类。