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. celery笔记六之worker介绍

    本文首发于公众号:Hunter后端 原文链接:celery笔记六之worker介绍 前面我们介绍过 celery 的理想的设计方式是几个 worker 处理特定的任务队列的数据,这样可以避免任务在队列 ...

  2. PHP正则按照从大到小的SIGN签名算法

    <?php/** * 签名算法 * @param unknown $key_id S_KEY(商户KEY) * @param unknown $array 例子:$array = array(' ...

  3. java.lang.IndexOutOfBoundsException

    原因:一个ArrayList数组中没有元素,而你想获取第一个元素,运行是就会报此类型的错误 解决方案:用 array[] 的  .length 查看 数组的长度

  4. GGTalk 开源即时通讯系统源码剖析之:数据库设计

    自从<开源即时通讯GGTalk 8.0发布,增加Linux客户端,支持在统信UOS.银河麒麟上运行!>一文在博客园发布后,有园友联系我QQ,说能不能整理个更系统更详细地介绍GGTalk源码 ...

  5. 图扑 AR 技术应用与管理:施工建造、机柜扫描、办公室导航解决方案

    随着科技的不断革新和创新,越来越多的行业开始迎来数字化时代的变革.建筑行业作为人类历史上最重要的产业之一,在数字化转型方面同样也在不断推进.图扑软件结合 AR 技术的应用,为建筑行业带来了更加便捷高效 ...

  6. 【转载】Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化

    原文链接: 作者:LoyenWang 出处:https://www.cnblogs.com/LoyenWang/ 公众号:LoyenWang 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作 ...

  7. 2023ccpc大学生程序设计竞赛-wh

    对于大一的我,只听说线下大型比赛,而第一次参加也必然心情激动,生为大一,由于没有参赛经历,所有不知道参赛技巧,所以三个人像个无头苍蝇一样,跟着榜单做,我作为写码的,其他两名队友负责思路和想法,第一道签 ...

  8. SpringBoot整合Websocket,实现作为客户端接收消息的同时作为服务端向下游客户发送消息

    SpringBoot整合Websocket 1. SpringBoot作为服务端 作为服务端时,需要先导入websocket的依赖 <dependency> <groupId> ...

  9. CobaltStrike4.8--云服务器搭建

    系统版本选用 选择最熟悉的版本,我这边用的CentOS7.8,选用乌班图的话,会有一些命令的不一致 配置运行环境 CobaltStrike4.0支持jdk1.8的环境,4.5开始就不支持1.8了,本文 ...

  10. Verilog实现奇分频电路

    在FPGA中,计数器电路用途很广,一般计数器电路都可作为分频电路.实现占空比为50的偶分频电路很好实现.但实现占空比为50的奇分频电路有点难度.下面给出一个简单例子,记录学习奇分频电路的过程. 实现占 ...