KNN分类算法

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算法就分享到这里了,虽然有点简单,但是个人觉得还行,有什么不好的地方,大家指正一下。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值