KNN算法是大家做数据分析常用的一种算法之一,这里我给大家分享一下用Python中KNN算法,有点简单,希望大家不要见笑。KNN算法,又叫k近邻分类算法。这里主要用到numpyh和matplotlib两个模块。k近邻分类算法是机器学习、数据分析的一种。同时也是监督算法,就是需要数据。就是每个数据都要有对应的含义。但是KNN不会自主学习。numpy是数据分析,机器学习等一个常用的模块。matplotlib作数据可视化。Python中都是列表,没有数据,所以引入numpy,将列表转化为数组。Python中不支持矩阵运算。接下来就是部分代码和完整代码的分享。
配置字体,显示中文,这里配置中文字体时是需要电脑本身有这个字体的,我采用的是仿宋。
plt.rcParams['font.sans-serif']=['fangsong']
写入数据和标签,这是随便写的例子,因为k算法是监督算法,需要数据。
group=np.array([[1,108],[5,78],[4,98],[7,102],[120,5],[121,8],[111,5],[125,8]])
label=['钢笔','钢笔','钢笔','钢笔','毛笔','毛笔','毛笔','毛笔']
下面就是numpy中的切片操作。
x=group[:,0]
y=group[:,1]
下面是这个完整的代码
# coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
#配置字体,显示中文
plt.rcParams['font.sans-serif']=['fangsong']
#创建数据集
def creatDataSet():
#输入四个数据
group=np.array([[1,108],[5,78],[4,98],[7,102],[120,5],[121,8],[111,5],[125,8]])
#写入标签
label=['钢笔','钢笔','钢笔','钢笔','毛笔','毛笔','毛笔','毛笔']
return group,label
if __name__=='__main__':
group,label=creatDataSet()
#切片操作
x=group[:,0]
y=group[:,1]
plt.scatter(x,y)
#增加信息,知道坐标和大小
plt.text(6, 92,'钢笔', size=30,)
plt.text(93, 12,'毛笔', size=30,)
plt.show()
效果图,如果没有配置中文字体的话显示的就是乱码或者方框。
上面是简单的基本操作,对于有点numpy和matplotlib基础的人来说都很简单,下面就是今天分享的主要内容。
数据还是采用上面的,这里主要用的之前所学的两点间计算公式,因为这个是K近邻算法,所以这里很简单,就是之前的数学公式。shape返回数组,进行矩阵相减,tile产生块矩阵,扩充扩展为四行一列的矩阵。
dataSetsize=dataSet.shape[0]
#矩阵相减
diffMat=np.tile(inX,(dataSetsize,1))-dataSet
#相减以后进行平方
sqdiffMat=diffMat**2
#按行相加
sqDistances=sqdiffMat.sum(axis=1)
#开平方
distances=sqDistances**0.5
这个就是两点之间的计算公式,通过很笨的方法计算出来的。
定义字典,统计出现对应标签出现的次数,lambda是匿名函数。
classCount={}
for m in range(k):
#前k个类别
voteIlabel=labels[sortedDistIndices[m]]
#计数
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
#从小到大返回字典的值
sortedClassCount=sorted(classCount.items(),key=lambda x:x[1],reverse=True)
下面就是完整的代码;
# coding:utf-8
import numpy as np
#创建数据集
def creatDataSet():
#输入四个数据
group=np.array([[1,108],[3,78],[5,98],[7,102],[120,9],[121,8],[111,5],[125,4]])
#写入标签
label=['钢笔','钢笔','钢笔','钢笔','毛笔','毛笔','毛笔','毛笔']
return group,label
#创建knn分类函数
def creatKnn(inX,dataSet,labels,k):
#计算行号,shape返回数组
dataSetsize=dataSet.shape[0]
#矩阵相减,tile产生块矩阵,扩充扩展为四行一列的矩阵
diffMat=np.tile(inX,(dataSetsize,1))-dataSet
#相减以后进行平方
sqdiffMat=diffMat**2
#按行相加
sqDistances=sqdiffMat.sum(axis=1)
#开平方
distances=sqDistances**0.5
print(distances)
#排序
sortedDistIndices=distances.argsort()
#定义字典
classCount={}
for m in range(k):
#前k个类别
voteIlabel=labels[sortedDistIndices[m]]
#计数
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
#从小到大返回字典的值,lambda匿名函数
sortedClassCount=sorted(classCount.items(),key=lambda x:x[1],reverse=True)
return sortedClassCount[0][0]
group,label=creatDataSet()
textclass=creatKnn([100,2],group,label,3)
print(textclass)
效果展示:
好了,knn算法就分享到这里了,虽然有点简单,但是个人觉得还行,有什么不好的地方,大家指正一下。