机器学习:K-近邻算法原理与Python代码实现

前言:本博文首先简单介绍机器学习的相关概念,然后选择一个简单的K-近邻算法,通过对算法原理的介绍和Python代码实现,使得大家对机器学习有一个初步的了解。

1、机器学习基础概念

1.1 我对机器学习的理解

机器学习(Machine Learning, ML)从字面理解,就是希望机器可以拥有学习能力。他的定义很多,大家可以自行百度,我简单的理解为:机器学习就是根据大量的数据或以往的经验进行学习,从而对一些原始数据进行归纳、综合,获取有用信息。

1.2 机器学习关键术语

机器学习的主要任务就是分类,后面我们相关系列的博文也大多以分类任务对机器学习进行介绍。现在我们以一个“鸟类”分类任务来介绍相关术语:就是说,给你一种鸟的相关数据,你怎么通过机器学习判断出它是那种鸟?
数据集X:表示鸟类信息的数据集合,一般是包含多个特征值数据的集合;
特征值xi:用于区分鸟类需要使用的不同的属性值,例如,体重、翼长、羽毛颜色、有无脚蹼......
目标变量y:表示分类的鸟种类,例如,露鹰、蜂鸟、啄木鸟等
训练集X_train:收集的数据集X和对应的目标变量y,用于学习:他是学习的经验,就等于我知道数据X对应的就是y种鸟;
测试集X_test:收集的数据集X:我想知道分类结果的鸟的数据集合;
验证集X_val:收集的数据集X和对应的目标变量y,用于验证模型的正确率:就是把模型预测的分类结果与实际的目标变量y对比,判断是否一致,从而统计正确率。当然,正确率越高越好。
ps:还有很多其他细节,就不一一列举了,后面遇到的会补充说明。


1.3 分类任务的流程

  • 输入:输入是包含N个鸟数据的集合,每种鸟的目标变量是多种分类结果中的一种。这个集合称为训练集。
  • 学习:这一步的任务是使用训练集来学习每个种类的鸟到底长什么样(是什么样的数据表示的)。一般该步骤叫做训练分类器或者学习一个模型。怎么学习的,学习的好坏,就取决于“学习算法”的选取。
  • 验证:输入没有学习过的鸟类数据集,根据模型预测得到分类结果Y,从而比较对应的实际目标变量y,如果Y==y说明预测正确,否则预测错误,统计正确率。
  • 测试:当学习得到一个高正确率的模型,就可以输入鸟类数据,从而得到分类结果了。

2、K-近邻算法

2.1 K-近邻算法原理

简单的说,K-近邻算法采用的是测量不同特征值之间的距离的方法进行分类。
他的工作原理是:存在一个样本数据集合,一般称作“训练集”,每组数据都有对应的标签,即我们知道样本数据集中每组数据与所属分类的对应关系。输入没有标签的新数据集合(测试集),将测试集的数据与训练集的数据按照每个特征值的距离进行比较,然后选取与训练集中距离最近的K个数据的分类标签来进行统计,K个标签中出现最多的就是分类结果,例如如果K=5,输入一组测试数据x_test=[20.3,23,yellow,no],最后得到y={啄木鸟、露鹰、蜂鸟、啄木鸟、啄木鸟},那就说明这组数据表示他是啄木鸟。

2.2 K-近邻算法代码实现

利用Python来实现他(代码基于Python2.7,Anaconda实现)这里的距离公式为L2距离公式:
#! /usr/bin/env python
#coding=utf-8
import numpy as np

class KNearestNeighbor(object):
    '''
    knn classifier with L2 distance
    '''
    def __init__(self):
        pass
    #输入训练数据集
    def train(self,X,y):
        self.X_train = X
        self.y_train = y
    #预测测试数据的分类结果   
    def predict(self,X_test,k=1):
        dist = self.distance(X_test)
        num_test = X_test.shape[0]
        y_pred = np.zeros(num_test)
        for i in xrange(num_test):
            closest_y = []
            closest_y = self.y_train[np.argsort(dist[i])[:k]]
            y_pred[i] = np.argmax(np.bincount(closest_y))
        return y_pred
    #将测试数据按照特征值与训练数据进行L2距离计算
    def distance(self,X_test):
        num_test = X_test.shape[0]
        num_train = self.X_train.shape[0]
        
        dist = np.zeros((num_test,num_train))
        for i in range(num_test):
            dist[i] = np.sqrt(np.sum(np.square(self.X_train - X_test[i]), axis = 1))
        return dist
    
#表示[-1,-2]=0,[-2,-1]=0,[1,1]=1,[2,2]=1
X = np.array([[-1,-2],[-2,-1],[1,1],[2,2]])
y = np.array([0,0,1,1])

X_test = np.array([[-3,-1],[-2,1],[1,3]])

knn = KNearestNeighbor()
knn.train(X,y)
y_pred = knn.predict(X_test,k=2)
print y_pred


ps:K-近邻算法中K 的选取一般称为“超参数”的确定,一般都是通过实验值或者经验确定,后面我会另起一章进行说明——利用验证集确定超参数。


如有错误之处,还望指教,谢谢。

猜你喜欢

转载自blog.csdn.net/huakai16/article/details/77937006