Python/matlab实现KNN算法

Python

算法伪码:

对未知类别属性的数据集中的每个点依次执行以下操作:

1)计算已知类别数据集中的点与当前点之间的距离;

2)按照距离递增次序排序;

3)选取与当前点距离最小的k个点;

4)确定前k个点所在类别的出现频率;

5)返回前k个点出现频率最高的类别作为当前点的预测分类。

欧氏距离计算:

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

(2)三维空间两点xA(x1,y1,z1)与xB(x2,y2,z2)间的欧氏距离:

(3)两个n维向量xA(x11,x12,…,x1n)与 xB(x21,x22,…,x2n)间的欧氏距离:

算法实现如下:

1、评价指标

def createDataSet():

group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

labels = [‘A‘,‘A‘,‘B‘,‘B‘]

return group, labels

2、knn核心算法

#inX    要检测的数据

#dataSet  数据集

#labels    结果集

#k      要对比的长度

def classify0(inX, dataSet, labels, k):

dataSetSize = dataSet.shape[0]                #计算有多少行

# tile(inX, (dataSetSize,1))生成对应inX维度的矩阵,方便做差

diffMat = tile(inX, (dataSetSize,1)) - dataSet

sqDiffMat = diffMat**2                          #差求平方

sqDistances = sqDiffMat.sum(axis=1)            # axis=0, 表示列 axis=1, 表示行。

distances = sqDistances**0.5                  #开方

sortedDistIndicies = distances.argsort()      #argsort()排序,求下标

classCount={}

for i in range(k):

voteIlabel = labels[sortedDistIndicies[i]]  #通过下标索引分类

# 通过构造字典,记录分类频数

classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1

# 对字段按值排序(从大到小)

sortedClassCount = sorted(classCount.items(),key=lambda classCount:classCount[1], reverse=True)

return sortedClassCount[0][0]

3、测试类

#测试

if __name__ == "__main__" :

dataset = array([[1.0, 1.1], [1.0, 1.0], [0.0, 0.0], [0.0, 0.1]])

labels = [‘A‘, ‘A‘, ‘B‘, ‘B‘]

X = [1.2, 1.1]

Y = [0.1, 0.1]

k = 3

labelX =  classify0(X,dataset,labels,k)

labelY =  classify0(Y,dataset,labels,k)

print ("Your input is:", X, "and classified to class: ", labelX)

print ("Your input is:", Y, "and classified to class: ", labelY )

结果:

Your input is: [1.2, 1.1] and classified to class:  A

Your input is: [0.1, 0.1] and classified to class:  B

4、注意

knn算法的开销很大,因为要计算每个样本点到其他所有点的距离.

knn算法的距离一般要根据实际样本点的情况来选取.

knn算法的距离阈值要根据样本的分散集中程度来选取.经验一般选取样本点集合的均方差.

matlab

5、任性matlab

没错,matlab就是这么任性只需要一行,其他都是读取数据

train_data=load(‘sample_feature.txt‘);

train_label=load(‘train_label.txt‘);

test_data=load(‘features.txt‘);

k=knnclassify(test_data,train_data,train_label,3,‘cosine‘,‘random‘);

train_data保存的是训练样本特征,要求是最能代表本类别的,不一定多,当然不能太少;

train_label保存的是样本标号,如0,1,2等等,随便设置,只有能区分就行,具体格式可以为:

test_data测试文件保存的是测试数据的特征;

关键函数介绍:

knnclassify是利用最近邻进行分类的分类器;

函数调用形式:

1.CLASS = KNNCLASSIFY(SAMPLE,TRAINING,GROUP)

标号和训练数据必须有相同的行数;训练数据和测试数据必须有相同的列;函数对于无效值或者空值会作为丢失值或者忽略这一行。

2.CLASS = KNNCLASSIFY(SAMPLE,TRAINING,GROUP,K)

此函数允许你设置距离矩阵形式,如:

‘euclidean‘    欧氏距离,默认的

‘cityblock‘    绝对差的和

‘cosine‘     角度距离

‘correlation‘ 相关距离

‘Hamming‘      汉明距离

3.CLASS =KNNCLASSIFY(SAMPLE,TRAINING,GROUP,K,DISTANCE,RULE)

本函数允许你选择如何对样本进行分类,如你可以选择:

‘nearest‘  最近的K个的最多数

‘random‘    随机的最多数

‘consensus‘ 投票法,默认的

而我选择的函数形式是:

k=knnclassify(test_data,train_data,train_label,3,‘cosine‘,‘random‘);

时间: 2024-11-03 22:49:16

Python/matlab实现KNN算法的相关文章

python实现简单knn算法

原理:计算当前点(无label,一般为测试集)和其他每个点(有label,一般为训练集)的距离并升序排序,选取k个最小距离的点,根据这k个点对应的类别进行投票,票数最多的类别的即为该点所对应的类别.代码实现(数据集采用的是iris): 1 import numpy as np 2 from sklearn.datasets import load_iris 3 from sklearn.model_selection import train_test_split 4 from sklearn

机器学习算法---kNN算法

kNN-------k-邻近算法 1.kNN是non-parametric分类器,既不做分布式假设,直接从数据估计概率密度: 2.kNN不适用于高维数据 优点: 1.无需估计参数,无需训练: 2.特别适合于多分类问题(对象具有多个标签). 缺点: 1.当样本容量不平衡是,输入有个新样本,该样本的K个邻值中大容量样本占多数,对分类不利: 2.计算量过大,需要计算待分类文本到每个样本的距离. 改进办法: 1.实现对样本属性进行适当删减,删除对结果影响较小的属性: 2.对距离加权,采取和样本距离小的待

【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库

[机器学习算法实现]系列文章将记录个人阅读机器学习论文.书籍过程中所碰到的算法,每篇文章描述一个具体的算法.算法的编程实现.算法的具体应用实例.争取每个算法都用多种语言编程实现.所有代码共享至github:https://github.com/wepe/MachineLearning-Demo     欢迎交流指正! (1)kNN算法_手写识别实例--基于Python和NumPy函数库 1.kNN算法简介 kNN算法,即K最近邻(k-NearestNeighbor)分类算法,是最简单的机器学习算

Python实现KNN算法

Python实现KNN算法 KNN算法的实际用处很多,主要用于分类阶段,是一个基础的分类算法.KNN主要基于距离的计算,一般可以在原始的欧氏空间中计算样本之间的距离.改进版本有:先特征提取到一个更加鉴别的空间中,然后计算距离:或者先使用metric learning度量学习的技术来获得一个鉴别的度量空间,然后计算样本间的马氏距离. 不管怎么说,KNN在很多算法的分类阶段都可以用到,我们这里用python实现KNN. 1. sklearn自带的KNN fromsklearn.neighborsim

Python KNN算法

机器学习新手,接触的是<机器学习实战>这本书,感觉书中描述简单易懂,但对于python语言不熟悉的我,也有很大的空间.今天学习的是k-近邻算法. 1. 简述机器学习 在日常生活中,人们很难直接从原始数据本身获得所需信息.而机器学习就是把生活中无序的数据转换成有用的信息.例如,对于垃圾邮件的检测,侦测一个单词是否存在并没有多大的作用,然而当某几个特定单词同时出现时,再辅以考虑邮件的长度及其他因素,人们就可以更准确地判定该邮件是否为垃圾邮件. 机器学习分为监督学习和无监督学习,其中: (1)监督学

[Python] 应用kNN算法预测豆瓣电影用户的性别

应用kNN算法预测豆瓣电影用户的性别 摘要 本文认为不同性别的人偏好的电影类型会有所不同,因此进行了此实验.利用较为活跃的274位豆瓣用户最近观看的100部电影,对其类型进行统计,以得到的37种电影类型作为属性特征,以用户性别作为标签构建样本集.使用kNN算法构建豆瓣电影用户性别分类器,使用样本中的90%作为训练样本,10%作为测试样本,准确率可以达到81.48%. 实验数据 本次实验所用数据为豆瓣用户标记的看过的电影,选取了274位豆瓣用户最近看过的100部电影.对每个用户的电影类型进行统计.

机器学习经典算法详解及Python实现--K近邻(KNN)算法

(一)KNN依然是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习所有算法中理论最简单,最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离最近的邻居进行分类判断(投票法)或者回归.如果K=1,那么新数据被简单分配给其近邻的类.KNN算法算是监督学习还是无监督学习呢?首先来看一下监督学习和无监督学习的定义.对于监督学习,数据都有明确的label(分类针对离散分布,回归针对连续分布),根据机器学习产

Python实现K近邻算法&lt;KNN&gt;_分类器

收集数据 数据来源:http://archive.ics.uci.edu/ml/datasets/Haberman%27s+Survival 文本数据如下图所示: 31,65,4,1 33,58,10,1 33,60,0,1 34,59,0,2 34,66,9,2 这是关于乳腺癌已手术患者存活时间(寿命)的样本集,文本文件中共包含306个样本,样本包含的属性有: 1. 患者做手术时的年龄 opAge 2. 患者做手术的年份-1900 opYear,比如1970年做的手术,则opYear属性的值为

Python 手写数字识别-knn算法应用

在上一篇博文中,我们对KNN算法思想及流程有了初步的了解,KNN是采用测量不同特征值之间的距离方法进行分类,也就是说对于每个样本数据,需要和训练集中的所有数据进行欧氏距离计算.这里简述KNN算法的特点: 优点:精度高,对异常值不敏感,无数据输入假定 缺点:计算复杂度高,空间复杂度高 适用数据范围:数值型和标称型(具有有穷多个不同值,值之间无序)    knn算法代码: #-*- coding: utf-8 -*- from numpy import * import operatorimport