前情说明
问题陈述
数据说明
KNN算法流程概述
代码实现
本书基于《特征工程入门与入门与实践》庄家盛 译版P53也K最近邻(KNN)算法进行讲解
Iris 鸢尾花数据集内包含 3 类分别为山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica),共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度。
sepallength:萼片长度
sepalwidth:萼片宽度
petallength:花瓣长度
petalwidth:花瓣宽度
我们的任务就是:给定一组记录(包含sepallength,sepalwidth,petallength,petalwidth),使用KNN算法给出该组记录的分类
本文使用数据源从机器学习库sklearn的datasets包中获取
# 导入iris数据
iris = datasets.load_iris()
可支持的数据集如下:
"load_digits",
"load_files",
"load_iris",
"load_breast_cancer",
"load_linnerud",
"load_sample_image",
"load_sample_images",
"load_svmlight_file",
"load_svmlight_files",
"load_wine",
#不知道为什么我的机器学习库只有这些数据集
参考链接: sklearn中的datasets数据集 - 知乎 (zhihu.com)
1.数据获取。要进行KNN,我们需要样本的部分属性完整数据以及在各种属性不同值的组合情况下的对应分类结果
2.数据清洗。获取数据后使用numpy整理缺失值,可视化查看是否有异常值(比如偏正态分布样本出现的极端值或者空值)
3.数据切分。将数据按照一定比例,从特定位置切分成训练集和测试集,必要情况还需要切割分一部分数据作为验证集
4.选取k个近邻点。使用某种数据结构或者库函数,获取逻辑距离最近的k个点位
5.获取结果。对k个点位进行统计,获取票数最多的结果进行分类。但是存在票数一致的情况,可以使用某种排序方式对数据进行排序,隐式的赋予某些特定的数据具有更高的优先级(即返回首位即可)
from sklearn import datasets
from collections import Counter # 为了做投票计数
from sklearn.model_selection import train_test_split
import random
import numpy as np
###############数据定义区
# 数据集划分随机数种子
randomNums=random.randint(1,9999)
print("随机数{}".format(randomNums))
# 最短投票对象数量
k=3
###############数据定义区END
# 计算同类属性的欧氏距离 假设能这样计算欧式距离代表样本之间的差距
def calcDistance(toBeMeasuredDataSet,DataSet):
# print("打印欧氏距离")
# print(toBeMeasuredDataSet,'\n',DataSet)
# **2的妙用
result=np.sqrt(np.sum((toBeMeasuredDataSet - DataSet)**2 ))
# print("打印欧氏距离",result)
return result
# 原始特征数据集 原始分类数据集 选取个数 待分类对象(一条记录)
def KNNSelect(X,Y,k,testObject):
# 获取欧氏距离列表 计算待测数据与特征数据集的欧数据集
distanceList=[calcDistance(testObject,singleData) for singleData in X ]
# 排序后 切片获取逻辑距离最短的k个对记录的下标(维护前k个最值)
theShortestIndex=np.argsort(distanceList)[:k]
# 获取这k个结果
resultList=Y[theShortestIndex]
# 返回频率最高的结果 作为样本的类别
return Counter(resultList).most_common(1)[0][0]
def printTopLineA():
print(r"/\/\/\/\/\/\/\/\/\/\/\/\/")
def printTopLineB():
print(r"\/\/\/\/\/\/\/\/\/\/\/\/\ ")
# 导入鸾尾花数据集
irisDataSet=datasets.load_iris()
#获取特征数据集
characteristicData=irisDataSet.data
# 获取分类数据集
categoricalData=irisDataSet.target
# 训练用特征数据集
# 测试用特征数据集
# 训练用分类数据集
# 测试用分类数据集
trainCharDataSet,testCharDataSet,trainCateDataSet,testCateDaSet\
=train_test_split(characteristicData,categoricalData,random_state=randomNums)
for index,i in enumerate(testCharDataSet):
print("第{}个数据\n特征数据是:{}\n数据的类别是:{}".format(index+1,i,KNNSelect(trainCharDataSet,trainCateDataSet,k,i)))
if (index&1):
printTopLineA()
else:
printTopLineB()
运行结果:
部分参考链接:
1.sklearn数据集——iris鸢尾花数据集_iris 数据_lyb06的博客-CSDN博客
2.【机器学习实战】科学处理鸢尾花数据集_鸢尾花数据标准化处理-CSDN博客
3.数据分析——鸢尾花数据集-CSDN博客
4.Python collections模块之Counter()详解_python counter-CSDN博客
5.Python基本函数:np.argsort()-CSDN博客
6.Python中的Counter.most_common()方法-CSDN博客
7.史上最全面K近邻算法/KNN算法详解+python实现 - 知乎 (zhihu.com)
8.什么是KNN算法? - 知乎 (zhihu.com)
9.sklearn中的datasets数据集 - 知乎 (zhihu.com)