KNN(k-NearestNeighbor)
- The book is written by Peter Harrington.
一. 写在前面
因为通过自学Weka,已经对ML有一定的了解。同时这本书的前言是很久以前读的了,故不打算再回顾一次了。对于刚入门的人,还是推荐去了解一下。Weka也是个很厉害的数据挖掘软件,有空再写写Weka的学习历程~
这里只会提到我对这些函数的理解,具体运用还是要去百度。
二. 需要用到的函数(功能)
1. mat()
2. eye()
即单位矩阵。稍微查了一下为什么eye是单位矩阵,大概是因为常用"I"表示单位矩阵,所以谐音。有点意思。
eye(m, n) — 产生m×n的单位矩阵
eye(m) — 产生m阶方阵
eye(size(A)) — 返回和矩阵A一样大小的单位矩阵;
3. I()
即返回逆矩阵inverse matrix。A乘A的逆矩阵等于单位矩阵。
4. tile()
即将矩阵”铺“开来。tile指铺地砖,平铺展示。
tile(mat, (a, b))
5. sum()
即求和函数
sum(axis=1) — 按行相加
sum(axis=0) — 按列相加
6. argsort()
即排序,返回的是数组值从小到大的索引值
argsort(x) — 升序
argsort(-x)— 降序
7. items()
以列表返回可遍历的(键, 值) 元组数组。
这个我还是不太清晰——对列表、字典、元组、集合的概念。
在本例中,为了遍历字典,需要一对一对的数据,所以用到了这个函数。
8.get()
返回指定键的值,如果值不在字典中返回默认值。
语法: dict.get(key, default=None)
9.sorted()
即排序。
语法: sorted(iterable, key=None, reverse=False)
- iterable:即需要排序的量。
- key:即可以对iterable进行一些操作,
比如:key = lambda x: abs(x) #按绝对值排序,其中lambda是所谓匿名函数,暂时用的。 - reverse:Ture — 降序; False — 升序。
三. 代码及注释
我是python3.7,因此书中的代码 iteritems() 改为了item() 。
from numpy import * #导入numpy库
import operator #运算符模块
def creatDataSet(): #创建数组
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group , labels
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0] #读取矩阵的长度,【0】指第一维度,此例为4
diffMat = tile(inX,(dataSetSize,1)) - dataSet #inX与dataset每个元素,求差
sqDiffMat = diffMat**2 #差值平方
sqDistances = sqDiffMat.sum(axis=1) #按行求和
distances = sqDistances**0.5 #开根号——就是距离了
sortedDistIndicies = distances.argsort() #从小到大排好,输出其索引值
classCount={} #创建字典-labels:票数
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #票数累加
sortedClassCount = sorted(classCount.items(),
key=operator.itemgetter(1),
reverse=True)
#itemgetter是定义一个函数,获取某个维度的值
return sortedClassCount[0][0]
小结:
- tile(inX,(dataSetSize,1)) - dataSet:一开始不理解这句,但画个图就清晰多了。
- 回忆一下,就是一个二维平面,每个点都有对应的标志(label)。这就是训练集。然后来了一个没有标志的点,看k个离它最近的点。
- 这一部分的学习,区分对字典、列表、元组等。