在开始写机器学习算法的意图,是因为最近有在上机器学习的相关课程,对本文有问题的同学👨🎓欢迎交流👏。
算法概述
算法本质就是物以类聚,人以群分的一个思想。想要知道从来没有出现的数据应该是一个什么样的类别,可以通过他身上的特征和某些人特别像,即向量之间的距离大小。
d
i
s
t
a
n
c
e
=
∑
i
n
(
x
i
−
n
e
w
i
)
2
distance =\sqrt{\sum_i^n(x_i-new_i)^2}
distance=i∑n(xi−newi)2
可以通过新来的向量,到原来标记好的向量距离来判断是否是一个群。
那么怎么样来确定一个群?
确定一个群的方式是通过K,我们在得到所有距离排序之后(从小到大)最靠前的K个。但不能够保证这个K个数据都是一个标签的,因此这里采用最直观暴力的方法少数服从多数的方法。最多的标签就是新来数据的标签。
优点:简单有效
缺点:无法给出任何数据的基础结构信息,本身也不需要去训练参数。如果数据量大,会需要大量计算
算法实现
所有的算法实现都采用比较简单数据集,不是说代码有多牛,就是单纯不想做只会调包的👨🎓。
所有例子都是本人亲手写了可以正常运行的。
#创建数据
def creatDataSet():
group = np.array([[1.0,1.1]
,[1.0,1.0]
,[0,0]
,[0,0.1]])
label = np.array(['A','A','B','B'])
return group,label
group,label = creatDataSet()
plt.scatter(group[:,0],group[:,1])
plt.rcParams['font.sans-serif']=['SimHei']
for i in range(len(group)):
plt.annotate((label[i]),xy=(group[i,0],group[i,1]),xytext=(group[i,0]+0.01,group[i,1]+0.01))
plt.show()
创建好数据集,建立分类器
def KNN(inx,group,label,k):
num = group.shape[0]
distance = (((np.tile(inx,(num,1)) - group)**2).sum(axis=1))**0.5 #计算距离公式
group_sorted = np.argsort(distance) #获得距离从小到大的排名
# classcount 实现一个简单投票功能
classcount = {}
for i in range(k):
lab = label[group_sorted[i]]
classcount[lab] = classcount.get(lab,0)+1
pridect = sorted(classcount.items(),key=lambda x: x[1],reverse=False)
return pridect
#这里我们可以随机输入新来的,俩特征都是0作为测试
KNN([0,0],group,label,3)[0][0]
返回值也是如预期 ‘A'