[C++与机器学习] k-近邻算法(K–nearest neighbors)

C++ with Machine Learning -K–nearest neighbors

我本想写C++与人工智能,但是转念一想,人工智能范围太大了,我根本介绍不完也没能力介绍完,所以还是取了他的子集。我想这应该是一个有关机器学习的系列文章,我会不定期更新文章,希望喜欢机器学习的朋友不宁赐教。

本系列特别之处是与一些实例相结合来系统的讲解有关机器学习的各种算法,由于能力和时间有限,不会向诸如Simon Haykin<<NEURAL NETWORKS>>等大块头详细的讲解某一个领域的所有算法与概念,我会有选择的讲解一些算法作为引导,如果要继续深入则推荐读者系统阅读相关书籍。

我相信认真看的每个人都能明白K近邻算法。

K–nearest neighbors,简称 KNN/kNN,用来处理分类和回归,它是最简单的Machine Learning Algorithm,所以以它为开端。这里考虑一个实例,有两个小组AB,A组为实践组,B组为理论组,A组的实践分平均为90,理论为30,B组实践分为20分,理论分为70分,现在有一个同学实践60分,理论60分,她到底属于哪个组?

就像上面的图片一样,不过我们可以使用欧氏距离[附录]计算出未知点与其他四个点的距离(相似度/相似值),然后把计算出来的值从小到大排序,选择K个值(这就是k的由来),这K个值都是选择最小的。

比如最后用欧氏距离计算出来的距离是

与1点的距离:5,

与2点的距离:5.3

与3点的距离:2.2

与4点的距离:7.12

我们就需要对上面排序,排成这样:

与3点的距离:2.2

与1点的距离:5,

与2点的距离:5.3

与4点的距离:7.12

这里假设K=3,就意味这我们需要选择前面三个数据,然后判断前面三个数据中A和B,3点是B类,1点是A类,2点是B类,这里显然B类多一些,所以未知数就是B类,到这里算法是想就解释了,很简单把,因为它是最简单的ML算法,下面就是C++的实现了

//A bad version about k-nearest neighbour algorithm,just a teaching sample.
#include <iostream>
#include <algorithm>
#include <map>
#include <math.h>

const int k=3;

std::ostream & operator<<(std::ostream& out, const std::pair<double,char>& p) {
  return out << p.first << "\t" << p.second;
}
//训练样本数据集
class simple_data{
public:
    simple_data(double x,double y,char classtype):
        type(classtype),datx(x),daty(y)
    {}
    inline double get_distance(double x0,double y0){
        return sqrt((pow(datx-x0,2)+pow(daty-y0,2)));//欧氏距离
    }
    char type;
private:
    double datx;
    double daty;
};

int main(){
    //构造<span style="font-family: Arial, Helvetica, sans-serif;">训练样本数据集,这样正常情况下应该从文本读入。为了方便就直接构造了</span>
    simple_data sd1(1.0,2.0,'A');
    simple_data sd2(2.0,3.0,'A');
    simple_data sd3(12.0,13.0,'B');
    simple_data sd4(8.0,9.0,'B');

    //读入需要分类的新数据,并计算它和所有点的距离
    double newdata[2]={1.0,1.0};
    std::map<double,char> mp;
    mp.insert(std::pair<double,char>(sd1.get_distance(newdata[0],newdata[1]),sd1.type));
    mp.insert(std::pair<double,char>(sd2.get_distance(newdata[0],newdata[1]),sd2.type));
    mp.insert(std::pair<double,char>(sd3.get_distance(newdata[0],newdata[1]),sd3.type));
    mp.insert(std::pair<double,char>(sd4.get_distance(newdata[0],newdata[1]),sd4.type));
    //得到相似度,并进行排序,最后输出
    unsigned int acout=0,bcout=0,i=0;
    std::cout<<"相似度:"<<'\t'<<"类型:\n";
    for(std::map<double,char>::iterator iter = mp.begin();
         iter != mp.end();++iter)
    {
        i++;
        std::cout << *iter <<std::endl;
        if(i<k){
            if(mp[i]='A'){
                acout++;
            }else{
                bcout++;
            }
        }
    }
    if(acout>bcout)
        std::cout<<"未知类型数属于:A";
    else
        std::cout<<"未知类型数属于:B"

}

这是一个比较糟糕的版本,比如样本数据直接指定了(一般是从其他文件读入),不过目的很简单就是这样能省去一些读写文件的代码能看得清楚一些。

本系列的源码我会修改它们写成一个可供调用的API,方便对于机器学习有兴趣而对编程不太熟悉的朋友直接调用从而编写程序。

补充

如果要计算2个以上特征值需要注意的除了改变距离计算方法之外还要注意K值尽量不要太大,实际上这一rule也存在于两个特征值,K值的大小和和数据的精确度是影响计算的两个方面,又尤其是数据精确度,建议尽量三位小数内进行计算,因为最后我们的目的是分类不是精确计算。

附:

1)欧氏距离

最常见的两点之间或多点之间的距离表示法,又称之为欧几里得度量,它定义于欧几里得空间中,如点 x = (x1,...,xn) 和 y = (y1,...,yn) 之间的距离为:

二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离:

本文由于只有两个特征值(就是XY)所以使用的,到底如何选择请根据实际情况而定,假如你需要分类的特征值除了理论分数实践分数之外还包括思想品德分数英语分数,显然就必须使用第一个公式.

2)曼哈顿距离(from http://blog.csdn.net/v_july_v/article/details/8203674/)

比较常见的一个距离计算,如A星寻路算法就使用的曼哈顿距离计算。

(1)二维平面两点a(x1,y1)与b(x2,y2)间的曼哈顿距离

(2)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的曼哈顿距离

[C++与机器学习] k-近邻算法(K–nearest neighbors),布布扣,bubuko.com

时间: 2024-08-13 10:01:29

[C++与机器学习] k-近邻算法(K–nearest neighbors)的相关文章

02-16 k近邻算法

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

机器学习实战笔记-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) #例如参数为

机器学习随笔01 - k近邻算法

算法名称: k近邻算法 (kNN: k-Nearest Neighbor) 问题提出: 根据已有对象的归类数据,给新对象(事物)归类. 核心思想: 将对象分解为特征,因为对象的特征决定了事对象的分类. 度量每个特征的程度,将其数字化. 所有特征值构成元组,作为该对象的坐标. 计算待检测对象和所有已知对象的距离,选择距离最接近的k个已知对象 (k近邻中的k来源于此). 这k个对象中出现次数最多的分类就是待检测对象的分类. 重要前提: 需要有一批已经正确归类了的对象存在.也就是通常说的训练数据. 重

机器学习(四) 机器学习(四) 分类算法--K近邻算法 KNN (下)

六.网格搜索与 K 邻近算法中更多的超参数 七.数据归一化 Feature Scaling 解决方案:将所有的数据映射到同一尺度 八.scikit-learn 中的 Scaler preprocessing.py import numpy as np class StandardScaler: def __init__(self): self.mean_ = None self.scale_ = None def fit(self, X): """根据训练数据集X获得数据的均

从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经网络:3.编程艺术第28章.你看到,blog内的文章与你于别处所见的任何都不同.于是,等啊等,等一台电脑,只好等待..”.得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任)

k近邻算法的Python实现

k近邻算法的Python实现 0. 写在前面 这篇小教程适合对Python与NumPy有一定了解的朋友阅读,如果在阅读本文的源代码时感到吃力,请及时参照相关的教程或者文档. 1. 算法原理 k近邻算法(k Nearest Neighbor)可以简称为kNN.kNN是一个简单直观的算法,也是机器学习从业者入门首选的算法.先看一个简单的应用场景. 小例子 设有下表,命名为为表1 电影名称 打斗镜头数量 接吻镜头数量 电影类型 foo1 3 104 爱情片 foo2 2 100 爱情片 foo3 1

K近邻算法

1.1.什么是K近邻算法 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1时,算法便成了最近邻算法,即寻找最近的那个邻居.为何要找邻居?打个比方来说,假设你来到一个陌生的村庄,现在你要找到与你有着相似特征的人群融入他们,所谓入伙. 用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属

基本分类方法——KNN(K近邻)算法

在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门算法. 参考内容如下:http://www.cnblogs.com/charlesblc/p/6193867.html 1.kNN算法又称为k近邻分类(k-nearest neighbor classification)算法. 最简单平凡的分类器也许是那种死记硬背式的分类器,记住所有的训练数据,对于