一.问题描述

用Python语言实现机器学习KNN算法,并用鸢尾花数据集测试。

 

二.算法设计

1.算法流程图

keras 鸢尾花分类 R语言 鸢尾花knn算法_数据

2.具体实现步骤

(1)定义一个My_KNN()函数实现KNN分类算法;

(2)函数参数设为鸢尾花的训练集和测试集;

(3)定义对应的三个列表用来存放测试数据与整个数据的欧氏距离;

(4)定义一个distance列表存放测试数据与所有训练数据的距离;

(5)定义三个整形变量分别表示三类鸢尾花与测试数据的邻近个数;

(6)调用math和numpy库中的函数计算测试数据与鸢尾花数据集的欧氏距离,并存入对应的列表,最后计算结束后,将distance列表按照升序重新排列;

(7)利用循环判断distance中的距离在哪一个列表中,即该类邻近个数自增,循环次数为k次;

(8)判断三类邻近个数的大小,个数最多的那一类即为测试数据的类别;

(9)利用循环判断测试集中正确的结果个数,并用公式计算出预测结果的准确性。

 

三.程序实现

# -*- coding: utf-8 -*-
"""
Created on Tue Oct 15 15:40:39 2019

@author: fanghejun
"""

import numpy
import math
from sklearn.datasets import load_iris                               #获取鸢尾花数据
from sklearn.model_selection import train_test_split                 #将数据分成测试集和训练集
 
def My_KNN(iris_datasets,expected_data):                         #定义knn算法函数,函数参数为训练集和测试集
    iris_data,expected_data,iris_target,expected_target = train_test_split(iris_datasets['data'],iris_datasets['target'],random_state=0)
    k = int(input("请输入邻居数k:"))                                  #输入邻近点数
    test_target = []                                                 #用来存放测试结果
    for j in range(0,len(expected_data)):
        distance = []                                                #用来存放测试集数据与训练集数据的欧氏距离
        iris1 = []                                                   #用来存放测试集数据与第一类鸢尾花数据的欧氏距离
        iris2 = []                                                   #用来存放测试集数据与第二类鸢尾花数据的欧氏距离
        iris3 = []                                                   #用来存放测试集数据与第三类鸢尾花数据的欧氏距离
        index1 = 0                                                   #测试集数据与第一类鸢尾花邻近个数
        index2 = 0                                                   #测试集数据与第二类鸢尾花邻近个数
        index3 = 0                                                   #测试集数据与第三类鸢尾花邻近个数
        for i in range(0,len(iris_data)):                            #计算欧氏距离
            distance.append(math.sqrt((numpy.square(expected_data[j][0]-iris_data[i][0])+numpy.square(expected_data[j][1]-iris_data[i][1])+numpy.square(expected_data[j][2]-iris_data[i][2])+numpy.square(expected_data[j][3]-iris_data[i][3]))))
            if(iris_target[i]==0):
                iris1.append(math.sqrt((numpy.square(expected_data[j][0]-iris_data[i][0])+numpy.square(expected_data[j][1]-iris_data[i][1])+numpy.square(expected_data[j][2]-iris_data[i][2])+numpy.square(expected_data[j][3]-iris_data[i][3]))))
            elif(iris_target[i]==1):
                iris2.append(math.sqrt((numpy.square(expected_data[j][0]-iris_data[i][0])+numpy.square(expected_data[j][1]-iris_data[i][1])+numpy.square(expected_data[j][2]-iris_data[i][2])+numpy.square(expected_data[j][3]-iris_data[i][3]))))
            elif(iris_target[i]==2):
                iris3.append(math.sqrt((numpy.square(expected_data[j][0]-iris_data[i][0])+numpy.square(expected_data[j][1]-iris_data[i][1])+numpy.square(expected_data[j][2]-iris_data[i][2])+numpy.square(expected_data[j][3]-iris_data[i][3]))))
            distance.sort(reverse = False)                           #将列表元素升序排列
            distance = distance[0:k-1]                               #截取最短的k个距离
        for m in distance:                                           #计算三个类别邻近数
            if m in iris1:                            
                index1=index1+1
            elif m in iris2:
                index2=index2+1
            else:
                index3=index3+1
        final=[index1,index2,index3]
        final_index= final.index(max(final))
        if final_index==0:                                            #分类
            test_target.append(0)
        elif final_index==1:
            test_target.append(1)
        else:
            test_target.append(2)
    print("预测分类:",test_target)
    correct = 0
    for i in range(0,len(expected_target)):                           #将测试集中正确的个数记录下来
        if(expected_target[i]==test_target[i]):
            correct=correct+1
    print("正确率为:","%.2f%%"%(correct/len(expected_target)*100))
if __name__ =="__main__":
    iris_datasets=load_iris()
    expected_data=[10,100,5,2]
    My_KNN(iris_datasets, expected_data)

四.运行、调试截图

运行截图:

keras 鸢尾花分类 R语言 鸢尾花knn算法_Python_02

调试截图:

keras 鸢尾花分类 R语言 鸢尾花knn算法_欧氏距离_03

 

keras 鸢尾花分类 R语言 鸢尾花knn算法_Knn_04

keras 鸢尾花分类 R语言 鸢尾花knn算法_Python_05

五.心得体会

本次重写Knn算法的程序是一次很新奇的代码体验,最初即使知道算法的目的也是无从下手,而且Python语言是这学期新接触的语言,因此对其语法、函数等的使用也是很陌生。在查阅了很多资料后才有了思路,本次程序主要借鉴了博客:

的程序。