常见机器学习算法学习——KNN(K邻近)

1、 算法简述    

文章中描述性内容,多来自维基百科KNN

KNN( k-nearest neighbors algorithm)是一种非参数、有监督算法,由T. M. COVER, P. E. HARTHart PE 在1967年提出,后被广泛应用于模式识别领域,既可用于分类也可以用于回归。

KNN是一种懒学习(lazy learning)算法,没有显式的训练过程;将多维特征空间中已经带有分类(分类问题)或属性值(回归问题)的数据集看做训练集,计算预测样本与训练集中个样本的邻近度(实用向量距离体现,如欧氏距离,马氏距离等),取K个最邻近样本,根据邻近样本投票(分类问题)或加权(回归问题),确定预测样本的分类或属性。因此,KNN算法的计算量非常大。

 

KNN分类(来自维基百科)
标题

 

借用维基百科这张被借用无数次的图片来大致描述KNN分类。图中蓝色及红色色块表示训练集中两类两类已打标签的样本,绿色圆形色块为待确定分类的预测集,采用欧氏距离(及实际距离)为邻近度准则,当K=3时,有效色块即为图中黑色圆形实线包围的色块,范围内红色三角形类别色块2个,方形蓝色色块1个,则训练集中的两类色块红色占多,则预测集绿色圆形色块被归入红色三角一类;当K=5时,有效色块即为图中黑色圆形虚线包围的色块,范围内红色三角形类别色块2个,方形蓝色色块3个,则训练集中的两类色块蓝色占多,则预测集绿色圆形色块被归入蓝色方形一类;

2、算法特点

3、相似算法

4、算法实现

KNN最方便的实现方法当然是调用sklearn中的KNN相应方法,为了更清晰展示KNN的基本原理,此处给出仅实现KNN基本过程的玩具代码:

# -*- coding: utf-8 -*-
"""
Created on Tue Sep 25 01:18:35 2018

@author: yzp1011
"""
import numpy as np
import pandas as pd
from functools import partial 


class KNN(object):
    def eu_distance(self,p1,p2):
        return np.linalg.norm(p1 - p2)

    def get_neighbors(self,train_set,test_set,k):
        vec = pd.DataFrame([partial(self.eu_distance,x) for x in train_set[:,0:-1]],columns = ['train'])
        
        print('vec\'s shae:{},label shape:{}'.format(vec.shape,len(train_set)))
        vec['label'] = train_set[:,-1].T
        try:
            assert test_set.shape[1] > 0
            for v in test_set:
                res = vec['train'].map(lambda x:x(v))
                out = vec.iloc[res.nlargest(k).index]['label'].mode()[0]
                print('x:{}-mode:{}'.format(v,out)) 
#        当预测向量长度为1时
        except IndexError:
            res = vec['train'].map(lambda x:x(test_set))
            out = vec.iloc[res.nlargest(k).index]['label'].mode()[0]
            print('x:{}-mode:{}'.format(test_set,out))           
        return self
    
    
if __name__ == '__main__':
    model = KNN()
    train_set = [[1,1,1,1], [2,2,2,1], [1,1,3,1], [4,4,4,2], [0,0,0,1], [4,4.5,4,2]]
    test_instance = [5,5,5]
    k = 3
    neigbors = model.get_neighbors(np.array(train_set),np.array(test_instance),k)

 

猜你喜欢

转载自blog.csdn.net/yzp1011/article/details/82839102