K最近邻算法实例(鸢尾花数据集)

K近邻算法介绍

K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。

本文介绍

本文利用python3+sklearn库自带的鸢尾花数据集,进行简单的KNN算法实现。下图展示了sklearn库中一些自带的数据的调用方法。

AltAlt

代码

以下是本次实例的详细代码。

# -*- coding: utf-8 -*-
# @Time     : 2019-12-09 15:49
# @Author   : lpeng
# @File     : test
# @Software : PyCharm Community Edition

"""
函数说明:KNN算法,分类器
parameters:
test_data - 测试数据
train_data - 训练数据
labels - 分类标签
k - KNN算法参数,选择距离最小的k个点

returnreturn sortedclasscount[0][0] - 分类结果

author:
fuyunjidun

email:
fuyunjidun@sina.com

modify:
2019-12-10
"""

from sklearn import datasets
import numpy as np
import operator

def classfy0(test_data,train_data,labels,k):
    #训练数据的行数
    train_data_size = train_data.shape[0]
    #在列向量上重复test_data共1次(横向)
    #在行向量上重复test_data共train_data_size次(纵向)
    #并与训练数据做差
    diffmat = np.tile(test_data,(train_data_size,1)) - train_data
    #计算测试数据预训练数据之间的差值的平方
    sqdiffmat = diffmat**2
    #计算测试数据各个特征向量与训练数据各个特征向量平方和,其中,sum(0)列相加,sum(1)行相加
    sqdistances = sqdiffmat.sum(axis=1)
    #计算距离
    distances = sqdistances**0.5
    #返回distances中元素从小到大排序后的索引值
    sorteddistindex = distances.argsort()
    
    #顶一个记录类别次数的字典
    classcount = {}
    for i in range(k):
        #取出前k个元素的类别
        voteilabel = labels[sorteddistindex[i]]
        #计算类别次数
        classcount[voteilabel] = classcount.get(voteilabel,0) + 1
    # key = operator.itemgetter(0) 根据字典的键进行排序
    # key = operator.itemgetter(1) 根据字典的值进行排序
    # reverse降序排序字典
    sortedclasscount = sorted(classcount.items(),key=operator.itemgetter(1),reverse=True)
    #返回次数最多的类别,即所要分类的类别
    return sortedclasscount[0][0]
    
if __name__ == '__main__':
    iris = datasets.load_iris()
    train_data = iris.data
    labels = iris.target
    flowernames = ['Setosa','Versicolour','Virginica']
    test_data = np.array([4,3,2,2])
    test_class = classfy0(test_data,train_data,labels,30)
    print('The predicted flower is:'+ flowernames[test_class]+'!')

结果

本例计算结果

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值