import operator
import numpy as np
# 鸢尾花的数据集 load_iris
from sklearn.datasets import load_iris '''
对测试集中的每个对象 X,依次执行以下操作:
(1)计算训练集中的所有对象与 X 之间的距离;
(2)按照距离递增的次序对训练集中的所有对象进行排序;
(3)选取与 X 距离最小的 K个对象;
(4)确定前 K 个对象所属类别的出现频率;
(5)返回前 K 个对象出现频率最高的类别,作为X的预测分类。
'''
######## 测试集 训练集 训练集对应的标签 几个最小的值
def knn(x_test, x_train, y_train, k):
#存储测试集预测出来的结果
predict_result_set=[]
# 训练集的长度
train_set_size = len(x_train) # 创建一个全零的矩阵,长度为130
distances = np.array(np.zeros(train_set_size))
# 计算每一个测试集与每一个训练集的距离
for i in x_test:
for indx in range(train_set_size):
# 计算数据之间的距离 欧式距离公式 来求测试数据到训练数据的距离
distances[indx] = np.sqrt(sum((i - x_train[indx]) ** 2))
sorted_dist = np.argsort(distances)
class_count = {}
# 取出k个最短距离
for i in range(k):
# 获得下标所对应的标签值
sort_label = y_train[sorted_dist[i]]
#print(i,sort_label,)
# get()函数返回指定键的值。
# 字典形式:key:判断之后的类别-value:有几个
class_count[sort_label]=class_count.get(sort_label, 0) + 1
# 对标签进行排序
sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)
# print(sorted_class_count)
predict_result_set.append(sorted_class_count[0][0])
# 返回预测结果列表
return predict_result_set
##########################################
#简单的数据集进行试验
# 训练集 [打架次数,接吻次数]
trainData = np.array([[3, 104], [2, 100], [1, 81], [101, 10], [99, 5], [98, 2]])
# 标签 代表的类别
labels = ['Romance', 'Romance', 'Romance', 'Action','Action','Action']
# 测试集
testData = [18, 90]
############################################
# KNN算法是最近邻算法的一个延伸。基本思路:选择未知样本一定范围内的K个近邻样本,如果该K个近邻大多数属于某一类型,则未知样本就判定为该类型。
# KNN 可以说是一种最直接的用来分类未知数据的方法。
# 采用少数服从多数的原则,给新数据归类. if __name__ == "__main__":
# 加载数据集数据
iris = load_iris()
# 样本数据150*4二维数据,代表150个样本,每个样本4个属性分别为花瓣和花萼的长、宽
iris_x = iris.data
# permutation接收一个数作为参数(150),产生一个0-149一维数组,只不过是随机打乱的,当然她也可以接收一个一维数组作为参数,结果是直接对这个数组打乱
indices = np.random.permutation(len(iris_x))
# 样本数据的标签
iris_y = iris.target
# x 数据
# y 对应的标签
x_train, x_test, y_train, y_test = iris_x[indices[:-20]],iris_x[indices[-20:]],iris_y[indices[:-20]],iris_y[indices[-20:]]
# 调用前面定义的knn函数 6代表距离最近的6个 按照少数服从多数的原则进行“定义“
result = knn(x_test,x_train, y_train, 6)
print("原有标签:", y_test)
# 为了方便对比查看,此处将预测结果转化为array,可直接打印结果
print("预测结果:", np.array(result)) '''
优点
(1)算法思路较为简单,易于实现;
(2)当有新样本要加入训练集时,无需重新训练(即重新训练的代价低);
(3)算法的时间复杂度和空间复杂度与训练集的规模呈线性关系(在一些场合不算太大)。
不足
(1)分类速度慢;
整个算法的时间复杂度可以用O(m*n)表示,其中m是训练集的属性(特征)个数,而n是训练集的对象个数
(2) 各属性的权重相同,影响了准确率;
(3) 各类样本的数量不平衡时,也会影响预测准确率;
(4)K值不好确定;
'''
'''
KNN的一些改进策略
如果在使用KNN算法之前对样本的属性进行约简,删除那些对分类结果影响较小(不重要)的属性,则可以用KNN算法快速地预测待分类样本的类别,从而可以得到更好的计算效果。
缩小不相关的训练样本
'''

结果:

基于Python语言的KNN算法的更多相关文章

  1. 关于《selenium2自动测试实战--基于Python语言》

    关于本书的类型: 首先在我看来技术书分为两类,一类是“思想”,一类是“操作手册”. 对于思想类的书,一般作者有很多年经验积累,这类书需要细读与品位.高手读了会深有体会,豁然开朗.新手读了不止所云,甚至 ...

  2. 《Selenium2自动化测试实战--基于Python语言》 --即将面市

    发展历程: <selenium_webdriver(python)第一版>   将本博客中的这个系列整理为pdf文档,免费. <selenium_webdriver(python)第 ...

  3. 基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)

    基于python语言的tensorflow的‘端到端’的字符型验证码识别 1   Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的 ...

  4. 关于《Selenium3自动化测试实战--基于python语言》

    2016年1月,机缘巧合下我出版了<Selenium2自动化测试实战--基于python语言>这本书,当时写书的原因是,大部分讲Selenium的书并不讲编程语言和单元测试框,如果想在项目 ...

  5. 使用python模拟实现KNN算法

    一.KNN简介 1.KNN算法也称为K邻近算法,是数据挖掘分类技术之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表. 2.KNN算法的核心思想是如果一个样本 ...

  6. selenium2自动化测试实战--基于Python语言

    自动化测试基础 一. 软件测试分类 1.1 根据项目流程阶段划分软件测试 1.1.1 单元测试 单元测试(或模块测试)是对程序中的单个子程序或具有独立功能的代码段进行测试的过程. 1.1.2 集成测试 ...

  7. selenium2环境搭建----基于python语言

    selenium支持多种语言如java.c#.Python.PHP等,这里基于python语言,所以这里搭建环境时需做俩步操作: ----1.Python环境的搭建 ----2.selenium的安装 ...

  8. 《Selenium 2自动化测试实战 基于Python语言》中发送最新邮件无内容问题的解决方法

    虫师的<Selenium 2自动化测试实战 基于Python语言>是我自动化测试的启蒙书 也是我推荐的自动化测试入门必备书,但是书中有一处明显的错误,会误导很多读者,这处错误就是第8章自动 ...

  9. Python简单实现KNN算法

    __author__ = '糖衣豆豆' from numpy import * from os import listdir import operator #从列方向扩展 #tile(a,(size ...

  10. 基于python语言的经典排序法(冒泡法和选择排序法)

    前 每逢周末就遇雨期,闲暇之余,捣鼓了下python,心心念想学习,今天就在电脑上装了个2.7,学习了下经典算法,冒泡与选择排序法 第一次写关于python的文章,说的不当之处,多多指正,我积极改正 ...

随机推荐

  1. java BigDecimal解决浮点数的精度丢失和大数计算问题

    java BigDecimal解决浮点数的精度丢失和大数计算问题 抛出浮点数问题: 先考个题,输入什么? System.out.println(0.1 + 0.2); 答案:0.30000000000 ...

  2. 在映客的虚拟KTV里唱了一首“爱你”

      如果你突然打了个喷嚏 那一定就是我在想你 如果半夜被手机吵醒 啊~那是你的虚拟 KTV 在响起 2022 年 5 月 18 日,映客 App 上线了业内首个元宇宙 K 歌玩法「全景 K 歌」,给用 ...

  3. 360OS张焰:AI视觉在教育中的应用

    11月24日,由即构科技主办的2020GET大会教育科技分论坛在北京成功召开,来自叮咚课堂.小冰.360OS.蕃茄田艺术.即构科技的6位资深教育/科技大咖,在论坛上进行深度分享. 以下为360OSAI ...

  4. CentOS 7相关操作

    防火墙操作 开启防火墙 sudo systemctl start firewalld.service 查看防火墙状态 sudo systemctl status firewalld.service 关 ...

  5. 前端Vue自定义开屏启动广告组件,点击广告图跳转广告详情

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身. 通过组件化开发,可以有 ...

  6. docker :repository docker.io/zookeeper not found: does not exist or no pull access

    分析 略 解决 vi /etc/docker/daemon.json { "registry-mirrors" : [ "http://registry.docker-c ...

  7. pandas 生成新的Dataframe

    选择某些列 import pandas as pd # 从Excel中读取数据,生成DataFrame数据 # 导入Excel路径和sheet name df = pd.read_excel(exce ...

  8. mysql注释的方法

    单行注释:"#", "--", 多行注释:/**/ 参考链接:https://www.cnblogs.com/JiangLe/articles/6897403. ...

  9. 洛谷 P1336 最佳课题选择 题解

    P1336 最佳课题选择 题解 状态:考虑\(f_{i,j}\)表示前\(i\)种论文里面,一共写了\(j\)篇,的最少花费时间. 转移策略:我们一次考虑每一种论文写多少篇.假设写\(k\)篇,\(k ...

  10. [golang]简单的文件上传下载

    前言 某次在客户内网传输数据的时候,防火墙拦截了SSH的数据包,导致没法使用scp命令传输文件,tcp协议和http协议也只放开了指定端口,因此想了个用http传输的"曲线救国"方 ...