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

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()


 

发布了30 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/selinaqqqq/article/details/89383909