一. KNN
- 第一个用来进行分类的机器学习算法
- KNN 的工作原理
存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。
输入本有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取出样本集中特征最相似数据(最近邻)的分类标签。
一般来说,我们只选择样本数据集中前k个最相似的数据,通常k是不大于20的证书
最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类
如何求距离:
二维空间:
多维空间:
eg:
电影的分类
与未知电影的距离
得到这个距离之后,我们就可以选择前K 个来判断未知电影的类型
实验代码如下:
from numpy import *
def createDataSet():
group = array([[3, 104], [2, 100], [1, 81], [101, 10], [99, 5], [98, 2]])
labels = ['Roman', 'Roman', 'Roman', 'Action', 'Action', 'Action']
return group, labels
def classify(inX, dataSet, labels, k):
# inX : 判断需要判断电影的类型
# dataSet : 已有数据的集合,每一句话的字典形式表达
# labels : 已有数据标签的集合
# shape : 输出数组的格式 6* 2 的数组
dataSetSize = dataSet.shape[0] # [6,2]
print("dataSetsize: ", dataSetSize)
# tile : 复制数组 tile:[0,1] ---> [3,1] : [0,1], [0,1],[0,1] [18,90] ---> [6,1] [18,90] - [3,104]
diffMat = tile(inX, (dataSetSize, 1)) - dataSet # (x2 - x1)
print("diffMat: ", diffMat)
sqDiffMat = diffMat ** 2 # (x2-x1) **2
print("sqDiffMat: ", sqDiffMat)
# axis 是需要加和的维度
# axis =1 : 行加和 ;axis =0 : 列加和
sqDistances = sqDiffMat.sum(axis=1)
print("sqDistances :", sqDistances)
distances = sqDistances ** 0.5
print("distances: ", distances)
# sortedDistIndicies: 是一个排好序的index
sortDistIndicies = distances.argsort()
print("sortedDistIndicies: ", sortDistIndicies)
Classcount = {}
for i in range(k):
voteIlabel = labels[sortDistIndicies[i]]
print("voteIlabel : ", voteIlabel)
# get 返回对应的key 和 value 值
Classcount[voteIlabel] = Classcount.get(voteIlabel, 0) + 1
print("Classcount:", Classcount)
sortedClasscount = sorted(Classcount.items(), key=lambda d: float(d[1]), reverse=True)
print("sortedClasscount : ", sortedClasscount)
return sortedClasscount
if __name__ == '__main__':
group, labels = createDataSet()
# group : 已有的数据 3 : k : 判断几个离他最近的个数
result = classify([18, 90], group, labels, 3)
运行结果为: