k近邻法matlab_机器学习系列(一)K近邻算法(KNN,KNearestNeigh
本文源自微信公众号【Python编程和深度学习】原文链接:机器学习系列(一)K-近邻算法(KNN,K-Nearest-Neighbor),欢迎扫码关注鸭!
![](/assets/blank.gif)
目录
一、算法概述
二、Python代码
三、Matlab 代码
一、算法概述
K-近邻算法是最简单的分类器,没有显式的学习过程或训练过程,是懒惰学习(Lazy Learning),数据集事先已经有了分类标签和数据特征值,对测试数据可以直接处理,其处理机制就是通过测量不同特征值之间的距离来进行分类,简单说就是如果测试样本在特征空间中的k个最邻近的样本中,大多数样本属于某个类别,则该测试样本也划分到这个类别,KNN里的K就是最邻近的K个数据样本。
![](/assets/blank.gif)
要确定绿圆属于哪个类别,如果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相关推荐
- 机器学习系列-强填EM算法在理论与工程之间的鸿沟(下)
前言 在上一篇文章<机器学习系列-强填EM算法在理论与工程之间的鸿沟(上)>中,小夕用优(恐)雅(怖)的数学理论来向读者解释了EM算法的工作原理.那么从工程角度出发的EM算法又是怎样的呢? ...
- 《机器学习系列-强填EM算法在理论与工程之间的鸿沟(上)》
小夕曾经问一位做机器学习理论的学姐:"学姐学姐,EM算法是什么呢?" 学姐回答:"EM算法啊,就是解决包含隐变量的参数估计问题." 小夕: 然后小夕去问一位做工 ...
- ccxt k线数据_机器学习系列:深度探秘K线结构新维度
标星★公众号,第一时间获取最新研究 来源:光大证券金工团队独家授权 作者:胡骥聪 近期原创文章: ♥ 基于无监督学习的期权定价异常检测(代码+数据) ♥ 5种机器学习算法在预测股价的应用(代码+数据) ...
- 机器学习系列(8)_回归算法,支持向量机
注:本篇文章参考:b站:机器学习经典算法--回归算法 文章目录 一.机器学习简介 二.回归算法 三.支持向量机要解决的问题 四.支持向量机求解目标 五.核函数变换 一.机器学习简介 机器学习应用的领域 ...
- 机器学习系列文章——算法的实现(knn,朴素贝叶斯,决策树,模型评估)
一.机器学习算法分类: 机器学习算法可分为两大类,即分类与回归.其中分类是针对离散型数据,比如判定一直动物是猫是狗,判断一个人的信用等级:而回归问题为针对连续型数据,如预测淘宝店铺销量,预测明天气温等 ...
- 推荐算法和机器学习系列 - 协同过滤推荐算法和余弦相似性算法
协同过滤算法 协同过滤(CF)推荐算法通过在用户活动中寻找特定模式来为用户产生有效推荐.它依赖于系统中用户的惯用数据,例如通过用户对其阅读过书籍的评价可以推断出用户的阅读偏好.这种算法的核心思想就是: ...
- 基于K近邻法的手写数字图像识别
数字图像处理课程论文 题目:数字图像识别 摘要 模式识别(PatternRecognition)是一 ...
- 机器学习理论《统计学习方法》学习笔记:第三章 k近邻法
机器学习理论<统计学习方法>学习笔记:第三章 k近邻法 3 k近邻法 3.1 K近邻算法 3.2 K近邻模型 3.2.1 模型 3.2.2 距离度量 3.2.3 K值的选择 3.2.4 分 ...
- 机器学习算法系列之K近邻算法
本系列机器学习的文章打算从机器学习算法的一些理论知识.python实现该算法和调一些该算法的相应包来实现. 目录 K近邻算法 一.K近邻算法原理 k近邻算法 通俗解释 近邻距离的度量 k值的选择 KN ...
最新文章
- 今日机器学习概念:感知机模型
- jssdk信息验证失败_阿里云环境中TLS/SSL握手失败的场景分析
- 晨哥真有料丨自信一点!恋爱做自己,不要自卑,不要迎合!
- group by用法 mysql_MYSQL GROUP BY用法详解
- windows10资讯和兴趣怎么关闭?
- HTTP认证模式:Basic and Digest Access Authentication
- 睡觉的时候,程序能不能自动查 bug?
- openssl ca文档翻译
- BAT机器学习面试1000题系列(第1~305题)
- 如何用python做无限弹窗_Python无限弹窗,开机启动,打包为exe程序
- Dijkstra算法
- 用特征根判别法判断AR模型的平稳性,再用随机模拟的方法来验证以及做自相关分析
- css实现多余图片隐藏
- ActiveMQ 简介
- python-RFM模型
- 【深度学习框架体系的学习】pytorch
- 适合mysql的网络存储_mysql 选择合适的存储引擎
- SpringBoot--任务:邮件任务
- 华为这么牛?21级程序员月薪看哭众人!网友直呼:我们不一样
- Word 自带公式转为mathtype格式
热门文章
- Windows Embedded Compact 7新特性
- S3C6410 KeyPad驱动(下)
- 配置连接池druid
- 阿里云腾讯云服务器配置流程(lnmp或tomcat)
- “5W1H”带你来学习JavaScript
- Material DesignDrawerLayout的旋转箭头的实现方式。
- FineUI(开源版)v6.0中FState服务器端验证的实现原理
- Asp.net使用代码修改配置文件的节点值
- STM8不用手动复位进入自带Bootloader方法(串口下载)
- iAPP(05)自习室占座