k-近邻算法实现鸢尾花分类

1 篇文章 0 订阅

k-近邻分类算法:给定一个训练集,对新输入的实例在这个集合中找k个与该实例最近的邻居,然后判断这k个邻居大多数属于某一类,于是新输入的实例就被划分为这一类。(属于惰性学习,并不具有明显的学习行为)
鸢尾花数据集
提取码:2dn7
k-近邻算法的三个核心要素:

  • k值的选取
  • 邻居距离的度量
  • 分类决策的制定

k值的选取对分类器的性能的影响。

k值小的影响k值大的影响
近似误差小,但预测的结果对训练样本非常敏感,鲁棒性较差。学习误差有所降低,但随着k值增大,分类错误率又会很快回升。k 值的增大裹挟着噪声而来,致使近似误差增大。

邻居距离的度量:不量化,无以度量

  • 归一化处理(Z-Score法,Min-Max法)

普遍的邻居距离度量有:

  • 欧几里得距离
    欧几里得距离
  • 曼哈顿距离
    曼哈顿距离
  • 马氏距离
    马氏距离
  • 海明距离

分类决策的制定

  • 平等投票表决原则(存在偏差较大)
  • 加权投票原则(距离越近的邻居权重越大)

实操
利用下载的鸢尾花特征数据生成鸢尾花可视化图

filename='iris.csv'
df=pd.read_csv('iris.csv',header=None)
X=df.iloc[0:150,[0,2]].values
plt.scatter(X[0:50,0],X[:50,1],color='blue',marker='x',label='setosa')
plt.scatter(X[50:100,0],X[50:100,1],color='red',marker='o',label='versicolor')
plt.scatter(X[100:150,0],X[100:150,1],color='green',marker='*',label='virginica')
plt.xlabel('petal width')
plt.ylabel('sepal length')
plt.legend(loc='upper left')
plt.show()

鸢尾花特征集合可视化图

完整的训练,预测,以及评估代码:

import numpy as np
from csv import reader
import pandas as pd
import matplotlib.pyplot as plt
import csv
import random
import math
import operator
#读取本地数据
#在函数中修改trainingSet和testSet,全局变量trainingSet和testSet也会发生改变:传的参数是引用,即直接检索的是地址
def loadDataset(filename,split,trainingSet=[],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:
                trainingSet.append(dataset[x])
            else:
                testSet.append(dataset[x])


#计算欧氏距离:
'''
先求得每对样本件的不同特征的差异值,
然后求差值的平方和,
然后再求这个和的平方根
'''
def EuclidDist(instance1,instance2,len):
    distance=0.0
    for x in  range(len):
        distance+=pow((instance1[x]-instance2[x]),2)
    return math.sqrt(distance)

#找位置点的邻居
def getNeighbors(trainSet,testInstance,k):
    distances=[]
    length=len(testInstance)-1
    for x in range(len(trainSet)):
        dist=EuclidDist(testInstance,trainSet[x],length)
        distances.append((trainSet[x],dist))
    distances.sort(key=operator.itemgetter(1))
    neighbors=[]
    for x in range(k):
        neighbors.append(distances[x][0])
    return neighbors

#判断归属的函数getClass
'''
统计邻居的类别,使用投票决策进行判别
'''
def getClass(neighbors):
    classVotes={}
    for x in range(len(neighbors)):
        instance_class=neighbors[x][-1]
        if instance_class in classVotes:
            classVotes[instance_class]+=1
        else:
            classVotes[instance_class]=1
    #python的内置函数sorted(),原型是sorted(iterable,key,reverse)。
    #iterable:指定要排序的可迭代对象。本例中classVotes.items()返回可迭代的字典元素
    #key:指定取待排序的那一项进行排序
    #reverse:布尔变量,true是降序,false是升序(默认)
    sortedVotes=sorted(classVotes.items(),key=operator.itemgetter(1),reverse=True)
    return sortedVotes[0][0]


#模型评估
'''
评估的指标是,测试集合的预测类别与其真实类别的比率
'''
def getAccurcy(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():
    trainingSet=[]
    testSet=[]
    split=0.7
    loadDataset('iris.csv',split,trainingSet,testSet)
    print('训练集样本数:' + repr(len(trainingSet)))
    print('测试集样本数:' + repr(len(testSet)))
    predictions=[]
    k=3
    #对预测集合元素进行预测
    for x in range(len(testSet)):
        #根据欧式距离(欧几里得)获取要进行预测的元素的neighbor
        neighbors=getNeighbors(trainingSet,testSet[x],k)
        #调用getClass函数,获取预测类别,然后存储
        result=getClass(neighbors)
        predictions.append(result)
        print('>预测='+repr(result)+',实际='+repr(testSet[x][-1]))
    #调用getAccuracy函数,对模型进行评估
    accuracy=getAccurcy(testSet,predictions)
    print('精确度为:'+repr(accuracy)+'%')


main()

运行结果:

训练集样本数:110
测试集样本数:40
预测=‘Iris-setosa’,实际=‘Iris-setosa’
预测=‘Iris-setosa’,实际=‘Iris-setosa’
预测=‘Iris-setosa’,实际=‘Iris-setosa’
预测=‘Iris-setosa’,实际=‘Iris-setosa’
预测=‘Iris-setosa’,实际=‘Iris-setosa’
预测=‘Iris-setosa’,实际=‘Iris-setosa’
预测=‘Iris-setosa’,实际=‘Iris-setosa’
预测=‘Iris-setosa’,实际=‘Iris-setosa’
预测=‘Iris-setosa’,实际=‘Iris-setosa’
预测=‘Iris-setosa’,实际=‘Iris-setosa’
预测=‘Iris-setosa’,实际=‘Iris-setosa’
预测=‘Iris-versicolor’,实际=‘Iris-versicolor’
预测=‘Iris-versicolor’,实际=‘Iris-versicolor’
预测=‘Iris-versicolor’,实际=‘Iris-versicolor’
预测=‘Iris-versicolor’,实际=‘Iris-versicolor’
预测=‘Iris-versicolor’,实际=‘Iris-versicolor’
预测=‘Iris-versicolor’,实际=‘Iris-versicolor’
预测=‘Iris-versicolor’,实际=‘Iris-versicolor’
预测=‘Iris-versicolor’,实际=‘Iris-versicolor’
预测=‘Iris-versicolor’,实际=‘Iris-versicolor’
预测=‘Iris-versicolor’,实际=‘Iris-versicolor’
预测=‘Iris-versicolor’,实际=‘Iris-versicolor’
预测=‘Iris-versicolor’,实际=‘Iris-versicolor’
预测=‘Iris-versicolor’,实际=‘Iris-versicolor’
预测=‘Iris-virginica’,实际=‘Iris-virginica’
预测=‘Iris-virginica’,实际=‘Iris-virginica’
预测=‘Iris-versicolor’,实际=‘Iris-virginica’
预测=‘Iris-virginica’,实际=‘Iris-virginica’
预测=‘Iris-virginica’,实际=‘Iris-virginica’
预测=‘Iris-virginica’,实际=‘Iris-virginica’
预测=‘Iris-virginica’,实际=‘Iris-virginica’
预测=‘Iris-virginica’,实际=‘Iris-virginica’
预测=‘Iris-virginica’,实际=‘Iris-virginica’
预测=‘Iris-virginica’,实际=‘Iris-virginica’
预测=‘Iris-versicolor’,实际=‘Iris-virginica’
预测=‘Iris-virginica’,实际=‘Iris-virginica’
预测=‘Iris-virginica’,实际=‘Iris-virginica’
预测=‘Iris-virginica’,实际=‘Iris-virginica’
预测=‘Iris-virginica’,实际=‘Iris-virginica’
预测=‘Iris-virginica’,实际=‘Iris-virginica’
精确度为:95.0%

k近邻算法是一种分类算法,它通过在给定的训练集中找到与新输入实例最近的k个邻居,并根据这些邻居的类别进行分类决策。在Python中,可以使用鸢尾花数据集来演示k近邻算法的应用。首先,使用Numpy库导入数据并进行操作,然后使用pyplot库绘制散点图来可视化数据。在散点图中,横坐标和纵坐标分别表示鸢尾花的花萼的长度和宽度。接下来,根据k近邻算法的原理,找到离待预测数据最近的几个点,并利用投票确定待预测数据的类别。根据图中的示例,可以看出待预测数据的类别应该与绿色点的类别相同,即为0。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [k-近邻算法实现鸢尾花分类](https://blog.csdn.net/HadesHuo/article/details/100641930)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [python之K-NN算法实现鸢尾花数据)](https://blog.csdn.net/qq_42419462/article/details/102506106)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值