【python】KNN(K近邻算法)实现及可视化

该博客介绍了K近邻算法的基本原理,并详细展示了在Python中实现KNN的步骤,包括数据集准备、距离计算、类别预测等。还讨论了K值选择的改进方法,提出将数据集划分为训练集和测试集来确定最佳K值,同时提供了KNN分类的函数抽象。文章附有可视化结果,展示分类效果。
摘要由CSDN通过智能技术生成

KNN(K近邻算法)实现及可视化

1 算法描述:

KNN的工作原理::给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻 近的k个实例,如果这k个实例的多数属于某个类别,那么新数据就属于这个类别。可以简单理解为:由那些离X最 近的k个点来投票决定X归为哪一类。

它的算法步骤为:(1) 计算已知类别数据集中的点与当前点之间的距离; (2) 按照距离递增次序排序; (3) 选取与当前点距离最小的k个点; (4) 确定前k个点所在类别的出现频率; (5) 返回前k个点出现频率最高的类别作为当前点的预测类别。

2 KNN算法的Python实现:

2.1 实践问题背景:

现要将目标分为四类,分别记为第0类、第1类、第2类、第3类。

2.2 目标:

给定目标向量,得出其所属类别。

image-20201126101741196

目标数据集是一个15行,每行有两个特征值的数据集。

2.3 数据集:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tsQIaCgx-1609429162595)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201126101025891.png)]

数据集从上至下依次代表了第0类到第3类数据。每个数据集有50行数据,每行有两个特征值。

2.4 要求:

通过python实现k最近邻算法。

2.5 实施步骤:

① 准备数据:

# loadtxt()函数是读取txt 文件,注意被读取的文件需要数据文件要求每一行数据的格式相同
data1 = np.loadtxt('data1.txt')
#绘制散点图
#scatter中的参数,第一个为横轴值,第二个为纵轴值,第三个为点的颜色
plt.scatter(data1[:,0],data1[:,1],color="r")
data2 = np.loadtxt('data2.txt')
plt.scatter(data2[:,0],data2[:,1],color="g")
data3 = np.loadtxt('data3.txt')
plt.scatter(data3[:,0],data3[:,1],color="b")
data4 = np.loadtxt('data4.txt')
plt.scatter(data4[:,0],data4[:,1],color="k")
# 给定的目标向量
objdata = np.loadtxt('objdata.txt')
plt.scatter(objdata[:,0],objdata[:,1],color="y")
plt.show()

# objdata 为待预测的数据集,Trains是已知的数据集(该数据集的类别是四类,分别对应0,1,2,3)
#vstack()能够合并所读取的数据集
Trains = np.vstack([data1,data2,data3,data4])
#为已知数据集,创建分类标签。
TrainsClass = np.vstack([np.zeros((50,1)),np.ones((50,1)),2*np.ones((50,1)),3*np.ones((50,1))])

②计算已知类别数据集中的点与当前点之间的距离

# 开始假设k值 k=10
k=10
for i in range(15):
    # 求已知类别的值与位置类别点的距离
    dist = (((Trains - objdata[i,:])**2).sum(1))**0.5
    # 对算出的距离进行排序,由小到大,所排的内容是已知数据集数据的下标
    # 这个下标与已知数据集的标签下标一致,可以借此找到数据所对应的标签
    sortedDist = dist.argsort()

③将距离升序排列,然后选取距离最小的k个点。

    #classCount空字典是用来,做分类计数。这是判断最终分类结果的关键。
    classCount = {
   }
    # k =10
    for i in range(k):
        # voteLabel 获得的是Trains数据集的分类
        voteLabel = str(TrainsClass[sortedDist[i]])
        #get 获取字典的值,参数1为键,参数2为默认的值。默认值在键所对应的值不存在的时候被触发,返回的是键所对应的值。
        #确定前K个点所在类别的出现频率
        classCount[voteLabel] = classCount.get(voteLabel,0)+1

④选择频率最高的类别作为当前点的预测类别。

	maxType = 0
    maxCount = -1
    # 找出出现次数最多的类别
    for key,value in classCount.items():
        if value > maxCount:
            maxType = key,
            maxCount = value

⑤上述的四个步骤执行一次可以分辨一个目标数据集中的向量值,但是在实际的判断中,我们不止判断一个。

#将所有类别最大的值存放在一个数组中
    if(maxType == (&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值