《机器学习实战》学习笔记:k-近邻算法实现

上一学期主要的学习和研究任务是模式识别、信号理论和图像处理,实际上这些领域都与机器学习有或多或少的交集。因此,仍在继续深入阅读《机器学习》、观看斯坦福大学的机器学习课程。在此过程中因为未来课题组项目的要求,需要接触Python,因此选择了《机器学习实战》这本书,同时参考教材和视频一起学习。事实上该书的理论研究不够深入,只能算是练习Python并验证一些著名的机器学习算法的工具书了。

在介绍k-近邻算法之前,对机器学习算法进行简单的分类和梳理:简单来说,机器学习主要分为两大类,有监督学习(supervised learning)和无监督学习(unsupervised learning)。有监督学习又可分两类:分类(classification.)和回归(regression),分类的任务就是把一个样本划为某个已知类别,每个样本的类别信息在训练时需要给定,比如人脸识别、行为识别、目标检测等都属于分类。回归的任务则是预测一个数值,比如给定房屋市场的数据(面积,位置等样本信息)来预测房价走势。而无监督学习也可以成两类:聚类(clustering)和密度估计(density estimation),聚类则是把一堆数据聚成弱干组,没有类别信息;密度估计则是估计一堆数据的统计参数信息来描述数据,比如深度学习的RBM。

作为开头章节,作者介绍了简单而容易理解的k-近邻(kNN)算法。该算法在模式识别一书中与Parzen窗估计放在一起讲,属于非参数估计的方法。这类方法用于处理任意形式的概率分布而不必事先考虑概率密度的参数形式。

更多关于非参数估计方法的介绍:http://blog.csdn.net/liyuefeilong/article/details/45274325

在使用k-近邻算法前,需要了解算法的优缺点和适用性:

优点:精度高,对异常数据不敏感,无数据输入假定

缺点:时间和空间复杂度均较高

适用的数据类型:数值型和标识型

基本K均值算法的基本思路为:首先你需要有一组训练样本,也称作训练样本集。该集合中每个样本的分类类别都是已知的,也就是我们知道每个数据与所属分类的对应关系。此时,可以输入一个待预测的数据,将新数据的每个特征与训练样本集中每个数据的特征进行比较,根据一种比较结果(如欧氏距离),找出k 个与待预测数据最相似的训练样本,看看这些训练样本都是属于哪一类的,最后就是秉承“多数占优”的原则:既然待预测数据与很多个某A类的训练样本都很近,和其他类不是很相近,那就把预测数据判定为A类吧。

在以上描述中提出使用欧氏距离作为待预测数据和训练样本集的比较结果,即假设测试样本为a,而xi表示训练样本集中的第i个样本,测试样本和训练样本均有n个特征属性,则测试样本和训练样本之间的欧氏距离定义为:

通常该算法的k是不大于20的正整数。当k=7 时,根据上述欧氏距离公式计算出78个与待预测数据最近的训练样本,在这7个实例中,某个分类出现的次数最多,则预测数据就被分到该类。

以下是根据《机器学习实战》一书写的代码,直接实现了k-近邻算法,由于对python不十分熟悉,因此对于kNN的算法实现难度主要存在于Numpy的使用上,但毕竟这是学习python的一个好机会,以下为算法的代码实现:

# -*- coding: utf-8 -*-
"""
Created on Sat Aug 29 14:36:02 2015

Input:   data: vector of test sample (1xN)
         sample: size m data set of known vectors (NxM)
         labels: labels of the sample (1xM vector)
         k: number of neighbors

Output:  the class label

@author: peng__000
"""

from numpy import *
import operator
from os import listdir

# training samples
sample = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])

# the labels of samples
label = [‘A‘, ‘A‘, ‘B‘, ‘B‘]

def classify(data, sample, label, k):
    SampleSize = sample.shape[0] # 训练样本集的行数
    DataMat = tile(data, (SampleSize, 1))  #将data扩展到和训练样本集sample一样的行数
    delta = (DataMat - sample)**2
    distance = (delta.sum(axis = 1))**0.5  # 以上三步计算欧氏距离
    sortedDist = distance.argsort()  # 对欧氏距离向量进行排序
    classCount = {}

    # 以下操作获取距离最近的k个样本的标签
    for i in range(k):
        votedLabel = label[sortedDist[i]]
        classCount[votedLabel] = classCount.get(votedLabel, 0) + 1
    result = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse = True)
    return result[0][0]

print classify([10,0], sample, label, 3) # test

这段简短的代码除了一些矩阵的操作、简单的排序操作外没有复杂的运算。

在简单完成k-近邻算法的实现后,接下来需要将算法的应用到别的场景,根据书本《机器学习实战》上的教程,主要测试了针对约会网站的分类和手写识别系统。

总的来说,k-近邻算法是模式识别和机器学习领域中最简单且最有效的分类算法,缺点是运算速度差强人意,而且在算法执行过程中须保存全部数据集,如果训练数据集非常巨大,必须使用大量的存储空间,此时算法的性能会大大降低。k-近邻算法的另一个缺陷是无法给出任何数据的基础结构信息,因此也无法知晓平均实例样本和典型实例样本具有什么样的特征。通过实验过程也可以发现,对参数的选取和调整要根据实际情况进行多次实验才能达到比较理想的效果。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 06:49:19

《机器学习实战》学习笔记:k-近邻算法实现的相关文章

R语言学习笔记—K近邻算法

K近邻算法(KNN)是指一个样本如果在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.即每个样本都可以用它最接近的k个邻居来代表.KNN算法适合分类,也适合回归.KNN算法广泛应用在推荐系统.语义搜索.异常检测. KNN算法分类原理图: 图中绿色的圆点是归属在红色三角还是蓝色方块一类?如果K=5(离绿色圆点最近的5个邻居,虚线圈内),则有3个蓝色方块是绿色圆点的"最近邻居",比例为3/5,因此绿色圆点应当划归到蓝色方块一类:如果

《机器学习实战》学习笔记——k近邻算法

1.numpy中一些函数的用法学习 shape()用法: shape : tuple of ints The elements of the shape tuple give the lengths of the corresponding array dimensions.. shape返回一个元组,依次为各维度的长度.shape[0]:第一维长度,shape[1]:第二维长度. tile()用法: numpy.tile(A, reps) Construct an array by repea

机器学习实战学习笔记(一)

1.k-近邻算法 算法原理: 存在一个样本数据集(训练样本集),并且我们知道样本集中的每个数据与其所属分类的对应关系.输入未知类别的数据后将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似(最近邻)的k组数据.然后将k组数据中出现次数最多的分类,来作为新数据的分类. 算法步骤: 计算已知类别数据集中的每一个点与当前点之前的距离.(相似度度量) 按照距离递增次序排序 选取与当前点距离最小的k个点 确定k个点所在类别的出现频率 返回频率最高的类别作为当前点的分类 py

机器学习实战笔记-K近邻算法1(分类动作片与爱情片)

K近邻算法采用测量不同特征值之间的距离方法进行分类 K近邻算法特点: 优点:精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围:数值型和标称型. K近邻算法原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近 邻)的分类标签.一般来说,我们只选择样本数据集中前k个最

机器学习实战笔记-K近邻算法2(改进约会网站的配对效果)

案例二.:使用K-近邻算法改进约会网站的配对效果 案例分析: 海伦收集的数据集有三类特征,分别是每年获得的飞行常客里程数.玩视频游戏所耗时间百分比. 每周消费的冰淇淋公升数.我们需要将新数据的每个新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签.一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数.最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类. 流程:在约会网站上使用K

机器学习实战笔记--k近邻算法

1 #encoding:utf-8 2 from numpy import * 3 import operator 4 import matplotlib 5 import matplotlib.pyplot as plt 6 7 from os import listdir 8 9 def makePhoto(returnMat,classLabelVector): #创建散点图 10 fig = plt.figure() 11 ax = fig.add_subplot(111) #例如参数为

机器学习实战笔记-K近邻算法3(手写识别系统)

1 准备数据:将图像转换为测试向量 这次数据集还是有两种,训练数据集和测试数据集,分别有2000个,900个. 我们将把一个32*32的二进制图像矩阵转换为1 x 1024的向量,这样前两节使用的分类器就可以处理数字图像信息了. 代码: def img2vector(filename): returnVect = zeros((1,1024)) file = open(filename) for i in range(32): line = file.readline() for j in ra

机器学习实战-学习笔记-第一章

Added C:\Anaconda and C:\Anaconda\Scripts to PATH. C:\Anaconda>pythonPython 2.7.10 |Anaconda 2.3.0 (64-bit)| (default, May 28 2015, 16:44:52) [MSC v.1500 64 bit (AMD64)] on win32Type "help", "copyright", "credits" or "

机器学习实战-学习笔记-第十四章

1.将代码拷贝到F:\studio\MachineLearningInAction\ch14下 2.启动ipython 3.在ipython中改变工作目录到F:\studio\MachineLearningInAction\ch14 In [17]: cd F:\\studio\\MachineLearningInAction\\ch14 F:\studio\MachineLearningInAction\ch14 4.在工作目录下新建一个svdRec.py文件并加入如下代码: from num

02-16 k近邻算法

[TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ k近邻算法 k近邻算法(k-nearest neighbors,KNN)是一种基本的分类和回归方法,本文只探讨分类问题中的k近邻算法,回归问题通常是得出最近的$k$个实例的标记值,然后取这$k$实例标记值的平均数或中位数. k近邻算法经常被人们应用于生活当中,比如傅玄曾说过"近朱者赤近墨者黑&quo