想写机器学习的基础算法代码实现很久了,差不多有1年了,但是自己太懒了,一直没有下笔,好不容易今天又来了兴趣,再不写,估计以后也不会写了哈哈哈,所以还是每天写一点吧,早点搞好机器学习,才能安心转到深度学习,不然心理老是感觉有个疙瘩,哈哈哈,加油李启飞,做最开心的自己!
下面的代码都是自己的理解,如有错误请大家批评指正!
K-近邻
我眼中的K-近邻共有三步:
1、计算待测样本A与数据集dataset中所有样本的欧式距离
欧式距离计算公式就是高中数学所学的计算向量距离的公式
2、距离排序
3、选取最近的K个点,返回K个点出现频率最高的类别作为当前点的预测类别
代码详解:
import numpy as np
import operator
def knn(test, dataset,labels,k):
"""
#计算test样本与dataset中所有样的距离,首先我们要想将test的维度变成和数据集dataset的维度一样
例如dataset=([[0, 1],
[2, 3],
[4, 5],
[6, 7]])有四个样本,两个特征属性
test = [0,0]
我们将test转变成test= ([[0, 0],
[0, 0],
[0, 0],
[0, 0]])
这样就可以批量就算距离了
test[0,0]与样本1[0,1]的距离,test[0,0]与样本2[2,3]的距离,
test[0,0]与样本3[4,5]的距离,test[0,0]与样本4[6,7]的距离
"""
#将test转变成与dataset一样的维度
test = np.tile(test,(dataset.shape[0],1))
"""
计算距离:第一步先算减法
subresult = test - dataset
第二步,计算平方
square = subresult**2
第三步,计算根号,根据公式先计算平方和,再开平方
sqdistance = square.sum(axis=1)
distance = sqdistance**0.5
"""
subresult = test - dataset
square = subresult**2
sqdistance = square.sum(axis=1)
distance = sqdistance**0.5
#到目前为止计算完距离,接下来是第二步,排序
Sorted = distance.argsort()
#sorted里存放的是排好序号的样本编号例:[4,2,3,1]表示样本一最远,以此类推
#选取最近的K个点,返回K个点出现频率最高的类别作为当前点的预测类别
classcount = {}
#字典key表示类别名,对应的值为类别出现的次数
for i in range(k):
#获取前k个距离最近的类的标签
classlabel = labels[int(np.argwhere(Sorted == i))]
#将出现的标签一次加入字典classcount中,出现一次累加一次此标签的个数
classcount[classlabel] = classcount.get(classlabel,0)+1
#标签出现的次数最多的就是此类
sortedclasscount = sorted(classcount.iteritems(),key=operator.itemgetter(1),
reverse=True)
return sortedclasscount[0][0]