《机器学习实战》知识点笔记目录 

K-近邻算法(KNN)思想:

1,计算未知样本与所有已知样本的距离

2,按照距离递增排序,选前K个样本(K<20)

3,针对K个样本统计各个分类的出现次数,取最大次数的分类为未知样本的分类

函数classify0虽然只有短短的几行代码,涉及的知识点却非常多,具体的知识点整理如下:

一、程序清单2-1笔记
1,shape函数
shape函数是numpy.core.fromnumeric中的函数,它的功能是查看矩阵或者数组的维数。
比如:
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
print(group)
print(group.shape)
print("group.shape[0]=%d" % group.shape[0])
结果如下:

dataset如下:
[[ 1. 1.1]
[ 1. 1. ]
[ 0. 0. ]
[ 0. 0.1]]
(4, 2)
group.shape[0]=4

2,tile函数
tile(数组,(在行上重复次数,在列上重复次数))
比如:
array1 = [1,2,3]
print(tile(array1,(2,1)))
print(tile(array1,(1,2)))
print(tile(array1,(2,2)))

结果如下:

[[1 2 3]
[1 2 3]]
[[1 2 3 1 2 3]]
[[1 2 3 1 2 3]
[1 2 3 1 2 3]]

3,sum函数.sum(axis=1)
我们平时用的sum应该是默认的axis=0 就是普通的相加
当加入axis=1以后就是将一个矩阵的每一行向量相加
如:
array2 = [[0,1,2],[0,3,4]]
print(sum(array2,axis=1))
print("\n")
结果如下:

[3 7]

4,sort函数和argsort函数
sort函数按照数组值从小到大排序
argsort函数返回的是数组值从小到大的索引值
如:
array3 = [3,2,1]
print(argsort(array3))
print(sort(array3))
print("\n")

结果如下:

[2 1 0]
[1 2 3]

5,字典get方法的参数k的意义
dic.get(key,k) = dic.get(key,默认值)
k的含义是:当字典dic中不存在key时,返回默认值k;存在时返回key对应的值
如下:

dic1 = {"A": 1, "B": 2, "C": 3}
print("dic 测试")
print(dic1.get("C",0))
print(dic1.get("D", 0))
print(dic1.get("E", 1))

结果如下:

dic 测试
3
0
1

6,字典的iteritems函数:
注意:python3中dict不存在iteritems,python2中存在
可以使用items代替

dic1 = {"A": 1, "B": 2, "C": 3}
print("测试字典的Item")
print( dic1.items() )
# python3中dict不存在iteritems 'dict' object has no attribute 'iteritems'
#print( dic1.iteritems())

测试结果如下:

测试字典的Item
dict_items([('A', 1), ('B', 2), ('C', 3)])

7,operator.itemgetter定义一个函数
operator.itemgetter(k)定义一个函数,返回第k个域的值
比如:

print("测试operator.itemgetter")
a=[1,2,3]
b=operator.itemgetter(2) #定义函数b,获取对象的第一个域的值
print(b(a))
b=operator.itemgetter(1,0)#定义函数b,获取对象的第1个域和第0个域的值
print(b(a))

测试结果:

测试operator.itemgetter
3
(2, 1)

二、所有的测试代码:
from numpy import *
import operator

def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group,labels

### test ##########################
group,labels = createDataSet()
print("dataset如下:")
print(group)
print(group.shape)
print("group.shape[0]=%d" % group.shape[0])
print("\n")

print(labels )
print("\n")

array1 = [1,2,3]
print(tile(array1,(2,1)))
print(tile(array1,(1,2)))
print(tile(array1,(2,2)))
print("\n")

array2 = [[0,1,2],[0,3,4]]
print(sum(array2,axis=1))
print("\n")

array3 = [3,2,1]
print(argsort(array3))
print(sort(array3))
print("\n")

dic1 = {"A": 1, "B": 2, "C": 3}
print("dic 测试")
print(dic1.get("C",0))
print(dic1.get("D", 0))
print(dic1.get("E", 1))

#测试字典的Item
print("测试字典的Item")
print( dic1.items() )
# python3中dict不存在iteritems 'dict' object has no attribute 'iteritems'
#print( dic1.iteritems())
print("\n")

#测试operator.itemgetter
print("测试operator.itemgetter")
a=[1,2,3]
b=operator.itemgetter(2) #定义函数b,获取对象的第一个域的值
print(b(a))
b=operator.itemgetter(1,0)#定义函数b,获取对象的第1个域和第0个域的值
print(b(a))

######函数定义

def classify0(inX,dataSet,labels,k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX,(dataSetSize,1)) - dataSet
print("diffMat")
print(diffMat)
print("\n")

sqDiffMat = diffMat ** 2
print("sqDiffMat")
print(sqDiffMat)
print("\n")

sqDistances = sqDiffMat.sum(axis=1)
print("sqDistances")
print(sqDistances)
print("\n")

distances = sqDistances ** 0.5
print("distances")
print(distances)
print("\n")

sortedDistIndicies = distances.argsort()
print("sortedDistIndicies")
print(sortedDistIndicies)
print("\n")

#统计前K个样本,各个label出现的次数
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
print("i=%s sortedDistIndicies[i]=%s voteIlabel=%s" % (i,sortedDistIndicies[i],voteIlabel) )
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
print(classCount)

print("\n")
sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1),reverse=True)
print("sortedClassCount")
print(sortedClassCount)
print("\n")

print("返回的分类为:%s",sortedClassCount[0][0])
return sortedClassCount[0][0]

print("开始执行分类函数.............")
classify0([0,0],group,labels,3)

三、运行结果如下:
"D:\Program Files\Python36\python.exe" E:/Code/Python/MachineLearningInAction/chapter02_KNN/kNN.py
dataset如下:
[[ 1. 1.1]
[ 1. 1. ]
[ 0. 0. ]
[ 0. 0.1]]
(4, 2)
group.shape[0]=4

['A', 'A', 'B', 'B']

[[1 2 3]
[1 2 3]]
[[1 2 3 1 2 3]]
[[1 2 3 1 2 3]
[1 2 3 1 2 3]]

[3 7]

[2 1 0]
[1 2 3]

dic 测试
3
0
1
测试字典的Item
dict_items([('A', 1), ('B', 2), ('C', 3)])

测试operator.itemgetter
3
(2, 1)
开始执行分类函数.............
diffMat
[[-1. -1.1]
[-1. -1. ]
[ 0. 0. ]
[ 0. -0.1]]

sqDiffMat
[[ 1. 1.21]
[ 1. 1. ]
[ 0. 0. ]
[ 0. 0.01]]

sqDistances
[ 2.21 2. 0. 0.01]

distances
[ 1.48660687 1.41421356 0. 0.1 ]

sortedDistIndicies
[2 3 1 0]

i=0 sortedDistIndicies[i]=2 voteIlabel=B
{'B': 1}
i=1 sortedDistIndicies[i]=3 voteIlabel=B
{'B': 2}
i=2 sortedDistIndicies[i]=1 voteIlabel=A
{'B': 2, 'A': 1}

sortedClassCount
[('B', 2), ('A', 1)]

返回的分类为:%s B

Process finished with exit code 0

《机器学习实战》知识点笔记目录

第2章KNN算法笔记_函数classify0的更多相关文章

  1. kNN算法笔记

    kNN算法笔记 标签(空格分隔): 机器学习 kNN是什么 kNN算法是k-NearestNeighbor算法,也就是k邻近算法.是监督学习的一种.所谓监督学习就是有训练数据,训练数据有label标好 ...

  2. 算法笔记--sg函数详解及其模板

    算法笔记 参考资料:https://wenku.baidu.com/view/25540742a8956bec0975e3a8.html sg函数大神详解:http://blog.csdn.net/l ...

  3. haskell学习笔记_函数

    一开始学习函数式编程语言就被告知函数式编程语言是一种“定义式”的语言,而不是一种命令式的语言,在学习haskell的函数语法时,此感觉更加强烈,haskell的函数定义倾向于一种类似C++里面的swi ...

  4. CPP笔记_函数返回局部变量

    本篇笔记记录的是关于返回函数中的局部值. 我们知道,在函数中创建的局部变量会随着函数的调用过程的结束,也即其对应函数栈帧的清除,而结束其生命周期.那么,如果我们把这个局部变量返回,就有可能存在该变量对 ...

  5. Machine Learning In Action 第二章学习笔记: kNN算法

    本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数 ...

  6. 机器学习实战书-第二章K-近邻算法笔记

    本章介绍第一个机器学习算法:A-近邻算法,它非常有效而且易于掌握.首先,我们将探讨女-近邻算法的基本理论,以及如何使用距离测量的方法分类物品:其次我们将使用?7««^从文本文件中导人并解析数据: 再次 ...

  7. 机器学习笔记--KNN算法2-实战部分

    本文申明:本系列的所有实验数据都是来自[美]Peter Harrington 写的<Machine Learning in Action>这本书,侵删. 一案例导入:玛利亚小姐最近寂寞了, ...

  8. C++ Primer 读书笔记:第11章 泛型算法

    第11章 泛型算法 1.概述 泛型算法依赖于迭代器,而不是依赖容器,需要指定作用的区间,即[开始,结束),表示的区间,如上所示 此外还需要元素是可比的,如果元素本身是不可比的,那么可以自己定义比较函数 ...

  9. 机器学习实战(笔记)------------KNN算法

    1.KNN算法 KNN算法即K-临近算法,采用测量不同特征值之间的距离的方法进行分类. 以二维情况举例:         假设一条样本含有两个特征.将这两种特征进行数值化,我们就可以假设这两种特种分别 ...

随机推荐

  1. Hibernate级联之一对多和inverse解析

    hibernate的级联可以说是hibernate最重要的部分,只有深入了解了级联的特性与用法,才能运用自如. 这次讨论一对多的情况,所以就使用博客项目的用户表和博客表作为示例,来一起学习hibern ...

  2. Nosql简介 Redis,Memchche,MongoDb的区别

    本篇文章主要介绍Nosql的一些东西,以及Nosql中比较火的三个数据库Redis.Memchache.MongoDb和他们之间的区别.以下是本文章的阅读目录 一.Nosql介绍 1.Nosql简介 ...

  3. javaScript(JS)强制保留两位小数的输入数校验和小数保留

    参考来源于网络,如有侵权,请联系作者删除: 输入input 的格式校验: $(function(){ var data = $.trim($("#inputId").val()); ...

  4. web离线应用--dom storage

    web离线应用--dom storage dom storage是html5添加的新功能,其实也不是什么新的应用,只不过是cookie的放大版本,由于cookie的大小只有4kb,而且在每次请求一个新 ...

  5. Javascript-基础概念总结

    [作用域]javascript中的作用域可以理解为一个语句执行的环境大小,有全局的作用域,函数作用域和eval作用域.在JS中没有块级作用域.讲到作用域,不得不讲执行环境,执行环境在JS中是最为重要的 ...

  6. 0:A+B Problem-poj

    0:A+B Problem 总时间限制:  1000ms 内存限制:  65536kB 描述 Calculate a + b 输入 Two integer a,,b (0 ≤ a,b ≤ 10) 输出 ...

  7. python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言)

    python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言) 感觉要总结总结了,希望这次能写个系列文章分享分享心得,和大神们交流交流,提升提升. 因为 ...

  8. TreeSet(一)--排序

    TreeSet(一) 一.TreeSet定义:      与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.            1)TreeSet类概述 ...

  9. mysql单表多表查询

    单表查询语法: select 字段1,字段2... from 表名where 条 件group by fieldhaving 筛选order by 字段limit 限制条数 关键字的优先级:from  ...

  10. daemon 启动system V init 和 systemd 配置

    先试着写一个udpserver的daemon #include <stdio.h> #include <sys/socket.h> #include <sys/types ...