本文源自微信公众号【Python编程和深度学习】原文链接:机器学习系列(一)K-近邻算法(KNN,K-Nearest-Neighbor),欢迎扫码关注鸭!


目录

一、算法概述
二、Python代码
三、Matlab 代码

一、算法概述

K-近邻算法是最简单的分类器,没有显式的学习过程或训练过程,是懒惰学习(Lazy Learning),数据集事先已经有了分类标签和数据特征值,对测试数据可以直接处理,其处理机制就是通过测量不同特征值之间的距离来进行分类,简单说就是如果测试样本在特征空间中的k个最邻近的样本中,大多数样本属于某个类别,则该测试样本也划分到这个类别,KNN里的K就是最邻近的K个数据样本。


要确定绿圆属于哪个类别,如果k=3,在其最近的3个样本中红色三角形数量最多,绿圆属于红色三角形类别,如果k=5,在其最近的5个样本中蓝色矩形数量最多,绿圆属于蓝色矩形类别,可见k的选择很重要。

当k很小时,结果很容易受噪声影响,容易发生过拟合。当k很大时,与测试样本差别很大的样本也会对预测结果产生影响,k通常取奇数,避免产生相等占比的情况。

我们在计算相邻样本的距离时一般采用欧式距离或者曼哈顿距离,公式如下:
欧式距离:
麦哈顿距离:
详细的算法过程:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
KNN的缺点:
当样本数据量很大时,需要大量的存储空间,而且计算距离也会耗时,不适用于随机分布的数据和样本不均衡的数据。

二、Python代码

#!/usr/bin/env python# -*- coding:utf-8 -*-import csvimport randomimport mathimport operator

# 加载数据集def loadDataset(filename, split, trainingSet = [], testSet = []):    with open(filename, 'r') as csvfile:        lines = csv.reader(csvfile)        dataset = list(lines)        for x in range(len(dataset)-1):            for y in range(4):                dataset[x][y] = float(dataset[x][y])            if random.random() #将数据集随机划分                trainingSet.append(dataset[x])            else:                testSet.append(dataset[x])

# 计算点之间的距离,多维度的def euclideanDistance(instance1, instance2, length):    distance = 0    for x in range(length):        distance += pow((instance1[x]-instance2[x]), 2)    return math.sqrt(distance)

# 获取k个邻居def getNeighbors(trainingSet, testInstance, k):    distances = []    length = len(testInstance)-1    for x in range(len(trainingSet)):        dist = euclideanDistance(testInstance, trainingSet[x], length)        distances.append((trainingSet[x], dist))   #获取到测试点到其他点的距离    distances.sort(key=operator.itemgetter(1))    #对所有的距离进行排序    neighbors = []    for x in range(k):   #获取到距离最近的k个点        neighbors.append(distances[x][0])        return neighbors

# 得到这k个邻居的分类中最多的那一类def getResponse(neighbors):    classVotes = {}    for x in range(len(neighbors)):        response = neighbors[x][-1]        if response in classVotes:            classVotes[response] += 1        else:            classVotes[response] = 1    sortedVotes = sorted(classVotes.items(), key=operator.itemgetter(1), reverse=True)    return sortedVotes[0][0]   #获取到票数最多的类别

#计算预测的准确率def getAccuracy(testSet, predictions):    correct = 0    for x in range(len(testSet)):        if testSet[x][-1] == predictions[x]:            correct += 1    return (correct/float(len(testSet)))*100.0def main():    #prepare data    trainingSet = []    testSet = []    split = 0.67    loadDataset(r'irisdata.txt', split, trainingSet, testSet)    print('Trainset: ' + repr(len(trainingSet)))    print('Testset: ' + repr(len(testSet)))    #generate predictions    predictions = []    k = 3    for x in range(len(testSet)):        # trainingsettrainingSet[x]        neighbors = getNeighbors(trainingSet, testSet[x], k)        result = getResponse(neighbors)        predictions.append(result)        print ('predicted=' + repr(result) + ', actual=' + repr(testSet[x][-1]))    print('predictions: ' + repr(predictions))    accuracy = getAccuracy(testSet, predictions)    print('Accuracy: ' + repr(accuracy) + '%')

if __name__ == '__main__':main()在实际使用时,可以用sklearn库,简单易用,例如

from sklearn import neighbors   //包含有kNN算法的模块knn = neighbors.KNeighborsClassifier()knn.fit(data, target)predictedLabel = knn.predict(testdata)

三、Matlab 代码

%% KNNclear allclc%% datatrainData = [1.0,2.0;1.2,0.1;0.1,1.4;0.3,3.5];trainClass = [1,1,2,2];testData = [0.5,2.3];k = 3;

%% distancerow = size(trainData,1);col = size(trainData,2);test = repmat(testData,row,1);dis = zeros(1,row);for i = 1:row    diff = 0;    for j = 1:col        diff = diff + (test(i,j) - trainData(i,j)).^2;    end    dis(1,i) = diff.^0.5;end

%% sortjointDis = [dis;trainClass];sortDis= sortrows(jointDis');sortDisClass = sortDis';

%% findclass = sort(2:1:k);member = unique(class);num = size(member);

max = 0;for i = 1:num    count = find(class == member(i));    if count > max        max = count;        label = member(i);    endenddisp('最终的分类结果为:');fprintf('%d\n',label)

部分转自:https://www.cnblogs.com/jyroy/p/9427977.html
https://www.cnblogs.com/ybjourney/p/4702562.html

k近邻法matlab_机器学习系列(一)K近邻算法(KNN,KNearestNeigh相关推荐

  1. 机器学习系列-强填EM算法在理论与工程之间的鸿沟(下)

    前言 在上一篇文章<机器学习系列-强填EM算法在理论与工程之间的鸿沟(上)>中,小夕用优(恐)雅(怖)的数学理论来向读者解释了EM算法的工作原理.那么从工程角度出发的EM算法又是怎样的呢? ...

  2. 《机器学习系列-强填EM算法在理论与工程之间的鸿沟(上)》

    小夕曾经问一位做机器学习理论的学姐:"学姐学姐,EM算法是什么呢?" 学姐回答:"EM算法啊,就是解决包含隐变量的参数估计问题." 小夕: 然后小夕去问一位做工 ...

  3. ccxt k线数据_机器学习系列:深度探秘K线结构新维度

    标星★公众号,第一时间获取最新研究 来源:光大证券金工团队独家授权 作者:胡骥聪 近期原创文章: ♥ 基于无监督学习的期权定价异常检测(代码+数据) ♥ 5种机器学习算法在预测股价的应用(代码+数据) ...

  4. 机器学习系列(8)_回归算法,支持向量机

    注:本篇文章参考:b站:机器学习经典算法--回归算法 文章目录 一.机器学习简介 二.回归算法 三.支持向量机要解决的问题 四.支持向量机求解目标 五.核函数变换 一.机器学习简介 机器学习应用的领域 ...

  5. 机器学习系列文章——算法的实现(knn,朴素贝叶斯,决策树,模型评估)

    一.机器学习算法分类: 机器学习算法可分为两大类,即分类与回归.其中分类是针对离散型数据,比如判定一直动物是猫是狗,判断一个人的信用等级:而回归问题为针对连续型数据,如预测淘宝店铺销量,预测明天气温等 ...

  6. 推荐算法和机器学习系列 - 协同过滤推荐算法和余弦相似性算法

    协同过滤算法 协同过滤(CF)推荐算法通过在用户活动中寻找特定模式来为用户产生有效推荐.它依赖于系统中用户的惯用数据,例如通过用户对其阅读过书籍的评价可以推断出用户的阅读偏好.这种算法的核心思想就是: ...

  7. 基于K近邻法的手写数字图像识别

                           数字图像处理课程论文                          题目:数字图像识别   摘要 模式识别(PatternRecognition)是一 ...

  8. 机器学习理论《统计学习方法》学习笔记:第三章 k近邻法

    机器学习理论<统计学习方法>学习笔记:第三章 k近邻法 3 k近邻法 3.1 K近邻算法 3.2 K近邻模型 3.2.1 模型 3.2.2 距离度量 3.2.3 K值的选择 3.2.4 分 ...

  9. 机器学习算法系列之K近邻算法

    本系列机器学习的文章打算从机器学习算法的一些理论知识.python实现该算法和调一些该算法的相应包来实现. 目录 K近邻算法 一.K近邻算法原理 k近邻算法 通俗解释 近邻距离的度量 k值的选择 KN ...

最新文章

  1. 今日机器学习概念:感知机模型
  2. jssdk信息验证失败_阿里云环境中TLS/SSL握手失败的场景分析
  3. 晨哥真有料丨自信一点!恋爱做自己,不要自卑,不要迎合!
  4. group by用法 mysql_MYSQL GROUP BY用法详解
  5. windows10资讯和兴趣怎么关闭?
  6. HTTP认证模式:Basic and Digest Access Authentication
  7. 睡觉的时候,程序能不能自动查 bug?
  8. openssl ca文档翻译
  9. BAT机器学习面试1000题系列(第1~305题)
  10. 如何用python做无限弹窗_Python无限弹窗,开机启动,打包为exe程序
  11. Dijkstra算法
  12. 用特征根判别法判断AR模型的平稳性,再用随机模拟的方法来验证以及做自相关分析
  13. css实现多余图片隐藏
  14. ActiveMQ 简介
  15. python-RFM模型
  16. 【深度学习框架体系的学习】pytorch
  17. 适合mysql的网络存储_mysql 选择合适的存储引擎
  18. SpringBoot--任务:邮件任务
  19. 华为这么牛?21级程序员月薪看哭众人!网友直呼:我们不一样
  20. Word 自带公式转为mathtype格式

热门文章

  1. Windows Embedded Compact 7新特性
  2. S3C6410 KeyPad驱动(下)
  3. 配置连接池druid
  4. 阿里云腾讯云服务器配置流程(lnmp或tomcat)
  5. “5W1H”带你来学习JavaScript
  6. Material DesignDrawerLayout的旋转箭头的实现方式。
  7. FineUI(开源版)v6.0中FState服务器端验证的实现原理
  8. Asp.net使用代码修改配置文件的节点值
  9. STM8不用手动复位进入自带Bootloader方法(串口下载)
  10. iAPP(05)自习室占座