一、 作业题目
编写KNN原生算法利用鸢尾花数据集预测花的品种,并计算准确率。
二、算法设计
1、对KNN的认识
KNN是一种监督式的学习算法,算法的主要目的是根据训练实例和对象的特征值来将对象分类。
总结可得KNN算法的五个步骤:
(1) 决定参数K,也就是最近邻居的个数
(2) 计算预测样本到所有训练样本的“距离”
(3) 根据计算出的距离,找出“距离”最近的K个邻居
(4) 收集这K个邻居的分类情况y
(5) 用这个K个邻居的y值“主要成分“作为预测样本的分类
2、设计过程
(1)导包
算法设计:
import csv #处理CSV文件
import random #处理随机数
import math
import operator #operator模块提供itemgetter函数
(2)收集数据
鸢尾花数据的获得有两种方法:一是通过开源项目sciket-learn导入鸢尾花数据,二是利用文件导入数据,在这里我使用了第二种方法,使用的是CSV格式的文件导入数据,CSV文件可以使用Excel格式打开。
CSV格式数据集下载链接:鸢尾花数据 密码:4leg ( 有.csv和.txt两种格式)
Python写入CSV文件的方法:CSV
(3)数据预处理
算法设计:
# 从文件中加载数据,将数据分成训练集和测试集,二者比例记为split
def loadDataset(filename, split, trainset=[], testset=[]):
with open(filename, 'r') as csvfile:
lines = csv.reader(csvfile)
dataset = list(lines)
#遍历数据
for x in range(len(dataset) - 1):
for y in range(4):
dataset[x][y] = float(dataset[x][y])
if random.random() < split:
trainset.append(dataset[x])
else:
testset.append(dataset[x])
(4)计算欧式距离
即计算待测试数据与训练数据集中的每个训练数据之间的距离来确定K个邻居
KNN算法采取的是欧氏距离,即连接各个点之间的真实距离。如二维空间中俩点(x1, y1)、(x2、y2)的欧氏距离公式为:
算法设计:
# 计算欧几里得几何距离确定K个邻居
def euclideanDistance(instance1, instance2, length): # example
dis