目录

  • 一、KNN算法Python实现
    • 1、导入包
    • 2、 画图,展示不同电影在图上的分布
    • 3、训练样本和待测样本准备
    • 4、计算待测样本点到每个训练样本点的距离
    • 5、查找离待测样本点最近的K个训练样本点的类型
    • 6、找出数量最多的类
    • 7、写成自定义函数
  • 二、鸢尾花(iris)数据集测试
    • 1、导入包
    • 2、导入数据,划分数据集
    • 3、调用写好的KNN函数,并计算查准率、查全率和混淆矩阵

KNN是机器学习十大算法之一,因为原理很好理解,有一句话:“Talk is cheap.Show me the code.” 所以用Python来实现一下吧,并在iris数据集上检验模型效果。

算法原理:看新样本与最接近的那个训练集样本属于哪一类,“最接近”一般是用距离来量化的。找到距离最近的K个训练样本,按“少数服从多数”原则,实现待判样本分类。
这里的距离(distance)用的是欧氏距离:

算法缺点:算法复杂度较高,因为要比较所有训练样本与待测样本;另外,当训练样本分布不均衡时,比如某一类样本占比过大,那待测样本就很容易被归为这一类,实际上可能距离并没有更接近,只是在数量上占了优势。
算法优化:所以有一个优化方法,弱化样本不平衡代来的影响,即将距离作为权重加权(weight=1/d),使得离待判样本越近的训练集样本权重越大。

下面就是我的实现过程了。这个例子是根据电影的打斗次数和接吻次数来划分电影类型。

调整调整一下:

一、KNN算法Python实现

1、导入包

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

2、 画图,展示不同电影在图上的分布

#画图
x1 = np.array([3,2,1])
y1 = np.array([104,100,81])
x2 = np.array([101,99,98])
y2 = np.array([10,5,2])
s1 = plt.scatter(x1,y1,c='r')
s2 = plt.scatter(x2,y2,c='b')
#未知电影
x = np.array([18])
y = np.array([90])
s3 = plt.scatter(x,y,c='k')
plt.legend(handles=[s1,s2,s3],labels=['Romance','Action','Unknow'],loc='best')
plt.show()

3、训练样本和待测样本准备

#定义训练样本,x有两个特征值
x_data = np.array([[3,104],[2,100],[1,81],[101,10],[99,5],[81,2]
])
#y为标签
y_data = np.array(['Romance','Romance','Romance','Action','Action','Action'])
#要测试的电影类型数据
x_test = np.array([18,90])

4、计算待测样本点到每个训练样本点的距离

#因为有6个训练样本,需要计算待测样本到6个训练样本点的距离
((np.tile(x_test,(x_data.shape[0],1))-x_data)**2).sum(axis=1)  # (xi-x)^2+(yi-y)^2
#求出测试点到每个点的距离
distances = (((np.tile(x_test,(x_data.shape[0],1))-x_data)**2).sum(axis=1))**0.5  #sqr((xi-x)^2+(yi-y)^2)
sort_distances = distances.argsort() #对距离按下标排序

5、查找离待测样本点最近的K个训练样本点的类型

k值的选取在这里是随便选的,实际情况需要根据模型效果多次调整。

k = 5   #设置K近邻的k为5
classcount = {}
#取前5个,求每一类的数量
for i in range(k):votlabel = y_data[sort_distances[i]]classcount[votlabel] = classcount.get(votlabel,0)+1
classcount

结果:

6、找出数量最多的类

#找出数量最多的类
max_k=''
max_v=0
for k,v in classcount.items():if v>max_v:max_v = vmax_k = k
print(max_k)

7、写成自定义函数

#x_data:训练样本特征值;
#y_data:训练样本标签(类型);
#x_test:待判样本;
#K:最近邻选择的样本点
#返回预测类型
def knn(x_test,x_data,y_data,k):#计算样本数量x_data_size = x_data.shape[0]# 复制x_testnp.tile(x_test,(x_data_size,1))# 计算x_test与每个样本的差值diffMat = np.tile(x_test,(x_data_size,1))-x_data# 计算差值的平方sqDiffMat = diffMat**2# 求和sqDistances = sqDiffMat.sum(axis=1)# 开方distances = sqDistances**0.5# 从小到大排序sortedDistances = distances.argsort()classCount = {}for i in range(k):# 获取标签votelabel = y_data[sortedDistances[i]]# 统计标签数量classCount[votelabel] = classCount.get(votelabel,0)+1# 找出数量最多的标签max_k = ''max_v = 0for k,v in classCount.items():if v > max_v:max_v = vmax_k = kreturn(max_k)

二、鸢尾花(iris)数据集测试

1、导入包

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split   #数据切分
from sklearn.metrics import classification_report,confusion_matrix   #查准率、查全率、混淆矩阵
import random

2、导入数据,划分数据集

#载入数据
iris = datasets.load_iris()
x_train,x_test,y_train,y_test = train_test_split(iris,iris.target,test_size = 0.2)

如果不想用自带的train_test_split()方法划分数据集,可以自己写,代码如下:

#由于鸢尾花数据都是按类别排列好了的,现在需要打乱数据
#相当于x_train,x_test,y_train,y_test = train_test_split(iris,iris.target,test_size = 0.2)  实现的功能
data_size = iris.data.shape[0]
index = [i for i in np.arange(data_size)]
random.shuffle(index)
iris.data = iris.data[index]
iris.target = iris.target[index]#切分数据集
test_size = int(data_size * 0.2)
x_train = iris.data[test_size:]
x_test = iris.data[:test_size]
y_train = iris.target[test_size:]
y_test = iris.target[:test_size]

3、调用写好的KNN函数,并计算查准率、查全率和混淆矩阵

prediction = []
#调用knn(x_test,x_data,y_data,k)函数
for i in range(x_test.shape[0]):prediction.append(knn(x_test[i],x_train,y_train,5))
print(classification_report(y_test,prediction))
print(confusion_matrix(y_test,prediction))


好像效果还不错的样子,继续加油↖(ω)↗

【机器学习算法】手动Python实现KNN分类算法,并用iris数据集检验模型效果相关推荐

  1. python分类算法_用Python实现KNN分类算法

    本文实例为大家分享了Python KNN分类算法的具体代码,供大家参考,具体内容如下 KNN分类算法应该算得上是机器学习中最简单的分类算法了,所谓KNN即为K-NearestNeighbor(K个最邻 ...

  2. 利用python语言实现分类算法_使用python实现kNN分类算法

    k-近邻算法是基本的机器学习算法,算法的原理非常简单: 输入样本数据后,计算输入样本和参考样本之间的距离,找出离输入样本距离最近的k个样本,找出这k个样本中出现频率最高的类标签作为输入样本的类标签,很 ...

  3. 使用Python处理KNN分类算法

    简介: 我们在这世上,选择什么就成为什么,人生的丰富多彩,得靠自己成就.你此刻的付出,决定了你未来成为什么样的人,当你改变不了世界,你还可以改变自己. KNN分类算法的介绍 KNN分类算法(K-Nea ...

  4. Python实现knn分类算法(Iris 数据集)

    1.KNN分类算法 KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算法,是一个概念极其简单,而分类效果又很优秀的分类算法. 他的核心思想就是,要确定 ...

  5. python knn-基于python实现KNN分类算法

    kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别 ...

  6. 用鸢尾花数据集实现knn分类算法

    一.题目: 原生python实现knn分类算法,用鸢尾花数据集 二.算法设计 1. 准备数据,对数据进行预处理 2. 选用合适的数据结构存储训练数据和测试元组 3. 设定参数,如k 4.维护一个大小为 ...

  7. 用Python开始机器学习(4:KNN分类算法)

    转自: http://blog.csdn.net/lsldd/article/details/41357931 1.KNN分类算法 KNN分类算法(K-Nearest-Neighbors Classi ...

  8. python 分类算法_python机器学习之KNN分类算法

    本文为大家分享了python机器学习之KNN分类算法,供大家参考,具体内容如下 1.KNN分类算法 KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算 ...

  9. 机器学习算法之——K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解

    K最近邻(k-Nearest Neighbor,KNN)分类算法详解及Python实现 一.基于实例的学习 二.k-最近邻法 1. KNN算法概述 2. 基本思想 3. 有关KNN算法的几点说明 4. ...

最新文章

  1. 谈谈几个 Spring Cloud 常见面试题及答案
  2. PSS:简单有效的End-to-End检测
  3. 成为数据科学家、人工智能和机器学习工程师的自学之路
  4. 基于SSM实现汽车租赁系统
  5. 广度优先搜索求解迷宫问题
  6. android 7.0 更新apk,Android更新apk兼容7.0和8.0
  7. 【perl】simpleHTTP
  8. Ubuntu上安装Robomongo及添加到启动器
  9. 9种深度学习算法简介
  10. [HDU4635] Strongly connected
  11. 单机启动nacos_SpringBoot集成Nacos的详细教程
  12. LeetCode:递归思想的延伸,从斐波那契数列到爬楼梯模型
  13. Java编程:爬楼梯问题、斐波那契数列问题
  14. html iframe 设置半透明_HTML基础教程:框架实例大合集
  15. 清明上河图密码2笔记
  16. 华为校园招聘面试题目及流程
  17. JsonPath 解析Josn字符串
  18. 01-探寻 JavaScript 反爬虫的根本原因
  19. MySQL初始密码忘记了怎么办
  20. 分享网页微信防撤回插件

热门文章

  1. 2022年湖南省临床执业医师考试混合单元随机模拟题
  2. OTA升级详解(一)
  3. 魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~18开始游戏-物体碰撞检测
  4. 机器学习:K-means算法基本原理及其变种
  5. NAND FLASH 和NOR FLASH
  6. 带你爬取双色球历史开奖信息并作可视化分析
  7. 速卖通选品推荐:韩国市场有哪些潜力机会商品?
  8. 让win7做无线路由,让小7无限上网!
  9. Java TCP实现高仿版QQ聊天(二)
  10. 彩虹外链网盘V5.4更新 新增用户系统与分块上传