机器学习算法之三—分类(一)

本文深入探讨了KNN算法的基本概念及其实现过程,详细解释了如何通过计算特征值之间的距离来决定样本所属的类别,提供了KNN算法的Python实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 KNN基本概念

    KNN是以近邻为基础的分类器,它不会尝试去构建一个普遍的内部模型,而只是把训练数据的实例简单的存储起来。最终的分类任务只是通过对需要分析或预测的点周围最近邻而完成的。即计算特征值之间的距离来决定,它的思路是:如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别,其中K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

在KNN中,通过计算对象间距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离或曼哈顿距离:

                      

简单来说KNN算法就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据(相似通常说的是距离),找出了K个最近邻,K中出现次数最多的那一个类别即样本所属的类别。

其算法的描述为:

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

4)确定前K个点中不同类别的出现频率;

5)出现频率最高的类别作为测试数据的预测分类。

2 KNN运行实例

#coding:utf-8
import pandas as pd
import numpy as np

class KNNa(object):

    #获取训练数据集
    def getTrainData(self):
        dataSet = pd.read_csv('D:\ML\classification\iris.csv', header=None)
        dataSetNP = np.array(dataSet[1:150])
        trainData = dataSetNP[:,0:dataSetNP.shape[1]-1]   #获得训练数据
        labels = dataSetNP[:,dataSetNP.shape[1]-1]    #获得训练数据类别
        return trainData,labels
    #得到测试数据的类别
    def classify(self, testData, trainData, labels, k):
        #计算测试数据与训练数据之间的欧式距离
        dist = []
        for i in range(len(trainData)):
            td = trainData[i,:]   #训练数据
            dist.append(np.linalg.norm(testData - td))   #欧式距离
        dist_collection = np.array(dist)   #获得所有的欧氏距离,并转换为array类型
        dist_index = dist_collection.argsort()[0:k]   #按升序排列,获得前k个下标
        k_labels = labels[dist_index]   #获得对应下标的类别

        #计算k个数据中,类别的数目
        k_labels = list(k_labels)   #转换为list类型
        labels_count = {}
        for i in k_labels:
            labels_count[i] = k_labels.count(i)  #计算每个类别出现的次数
        testData_label = max(labels_count, key=labels_count.get)   #次数出现最多的类别
        return testData_label

测试:

>>> kn = KNNa()
>>> trainData, labels = kn.getTrainData()
>>> testData = np.array([5.1, 3.5, 1.4, 0.2])
>>> k=10
>>> testData_label = kn.classify(testData,trainData,labels,k)
>>> print testData_label
1.0
>>> exit()


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值