参见《机器学习实战》

 # -*- coding:cp936 -*-
#===============================================================================
# 设计KNN最近邻分类器:
# 找出每个元素在数据集中的最近邻的K个数据,统计这K个数据所属的类,所属类最多的那个类就是该元素所属的类
#===============================================================================
import numpy as np def loadHaiLunData(f_name):
with open(f_name) as fHandle:
fLines = fHandle.readlines()
dataLines = len(fLines)
label = []
dataSetMat = np.zeros((dataLines,3))
for i in range(dataLines):
lineList = fLines[i].strip().split('\t')
dataSetMat[i,:] = lineList[0:3]
label.append(int(lineList[-1]))
return dataSetMat,label def dataNorm(dataSet):
numOfEle = dataSet.shape[0]
minEle = dataSet.min(0)
maxEle = dataSet.max(0)
normedData = (dataSet-np.tile(minEle,(numOfEle,1)))/np.tile(maxEle-minEle,(numOfEle,1))
return normedData def classifyKnn(inX, dataSet, label, k):
#===========================================================================
# inX:输入向量
# dataSet:保存数据特征的数组,每一行为若干个特征的参数,与label对应
# label:表明当前这个数据集中的每一个元素属于哪一类
# k:设定最近邻的个数
#=========================================================================== #首先对数据集进行归一化
# dataSet = dataNorm(dataSet)
numOfEle = dataSet.shape[0]
index = 0
diffDistance = dataSet - np.tile(inX, (numOfEle,1))
diffDistance = diffDistance**2
squareDistance = diffDistance.sum(1)
# squareDistance = squareDistance**0.5
knnIndex = squareDistance.argsort()
#统计最近的k个近邻的label,看哪个label类别最多就可将该训练元素判为对应类
staticDict = {}
for i in range(k):
staticDict[label[knnIndex[i]]]=staticDict.get(label[knnIndex[i]],0)+1
itemList = staticDict.items()
argmax = np.argmax(itemList, axis = 0)
return itemList[argmax[1]][0] def testHaiLunClassify(k = 3, hRatio = 0.5):
dataSet,label = loadHaiLunData('datingTestSet2.txt')
# hRatio = 0.5
totalNum = dataSet.shape[0]
testNum = int(totalNum*hRatio)
dataNormed = dataNorm(dataSet)
errorClass = 0
for i in range(testNum):
classRes = classifyKnn(dataNormed[i,:], dataNormed[testNum:,:], label[testNum:], k)
if classRes != label[i]:
errorClass += 1
# print "classify error, No. %d should be label %d but got %d"%(i, label[i],classRes)
errorRate = errorClass/float(testNum)
# print
# print "Error rate: %f"%(errorRate)
return errorRate if __name__ == '__main__':
errorList = []
kRange = range(1,50,1)
for k in kRange:
errorList.append(testHaiLunClassify(k))
print errorList
import matplotlib.pyplot as plt
fig = plt.figure(1)
# ax = fig.add_subplot(111)
plt.plot(kRange, errorList,'rs-')
plt.show()

k-近邻分类的Python实现的更多相关文章

  1. K近邻分类算法实现 in Python

    K近邻(KNN):分类算法 * KNN是non-parametric分类器(不做分布形式的假设,直接从数据估计概率密度),是memory-based learning. * KNN不适用于高维数据(c ...

  2. 每日一个机器学习算法——k近邻分类

    K近邻很简单. 简而言之,对于未知类的样本,按照某种计算距离找出它在训练集中的k个最近邻,如果k个近邻中多数样本属于哪个类别,就将它判决为那一个类别. 由于采用k投票机制,所以能够减小噪声的影响. 由 ...

  3. 查看neighbors大小对K近邻分类算法预测准确度和泛化能力的影响

    代码: # -*- coding: utf-8 -*- """ Created on Thu Jul 12 09:36:49 2018 @author: zhen &qu ...

  4. 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

    (一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...

  5. Python机器学习基础教程-第2章-监督学习之K近邻

    前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...

  6. 机器学习PR:k近邻法分类

    k近邻法是一种基本分类与回归方法.本章只讨论k近邻分类,回归方法将在随后专题中进行. 它可以进行多类分类,分类时根据在样本集合中其k个最近邻点的类别,通过多数表决等方式进行预测,因此不具有显式的学习过 ...

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

    在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...

  8. (数据挖掘-入门-6)十折交叉验证和K近邻

    主要内容: 1.十折交叉验证 2.混淆矩阵 3.K近邻 4.python实现 一.十折交叉验证 前面提到了数据集分为训练集和测试集,训练集用来训练模型,而测试集用来测试模型的好坏,那么单一的测试是否就 ...

  9. 数据挖掘算法(一)--K近邻算法 (KNN)

    数据挖掘算法学习笔记汇总 数据挖掘算法(一)–K近邻算法 (KNN) 数据挖掘算法(二)–决策树 数据挖掘算法(三)–logistic回归 算法简介 KNN算法的训练样本是多维特征空间向量,其中每个训 ...

  10. 机器学习--K近邻 (KNN)算法的原理及优缺点

    一.KNN算法原理 K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法. 它的基本思想是: 在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对 ...

随机推荐

  1. js数组的迭代

    以下介绍两种数组形式的迭代:一是简单的数组:二是数组里面套Object(json格式). 一.var arr=[1,2,3] var arr=[1,2,3] for (var i = 0; i < ...

  2. 你不需要jQuery

    http://www.webhek.com/you-do-not-need-jquery

  3. PAT-乙级-1032. 挖掘机技术哪家强(20)

    1032. 挖掘机技术哪家强(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 为了用事实说明挖掘机技术到底 ...

  4. 论反馈信息如何推动 IT 运维团队进步?

    我们还记得<快乐大本营>中经典游戏----快乐传真吗?游戏规则是:很多人站一排,只有第一个人才看到最准确的信息,用东西隔着,戴耳机,一一将从前一个人获得的信息传递下去,最后一个人说出推测的 ...

  5. python参考手册--第3章类型和对象

    1.对象的身份.类型.值 (1)身份:对象在内存中位置的指针,地址值, >>> a = [1,2,3,4,5] >>> id(a)48497328 >> ...

  6. 用CodeViz绘制函数调用关系图(call graph)

    CodeViz是<Understanding The Linux Virtual Memory Manager>(at Amazon,下载地址在页尾)的作者 Mel Gorman 写的一款 ...

  7. java中 正则表达式的使用

    推荐使用第一种 第一种: //对接收的文件名的合法性进行验证 String fileName="127.0.0.1_01_20140428165022174.jpg"; Strin ...

  8. vimrc for mac

    " Configuration file for vim set modelines=0 " CVE-2007-2438 " Normally we use vim-ex ...

  9. Git教程之使用GitHub

    我们一直用GitHub作为免费的远程仓库,如果是个人的开源项目,放到GitHub上是完全没有问题的.其实GitHub还是一个开源协作社区,通过GitHub,既可以让别人参与你的开源项目,也可以参与别人 ...

  10. JMS基础(1)

    1.  消息中间件: 将信息以消息的形式,从一个应用程序传送到另一个或多个应用程序. 主要特点: (1) 消息异步接收: 消息发送者不需要等待消息接收者的响应 (2) 消息可靠接收: 确保消息在中间件 ...