k-近邻分类的Python实现
参见《机器学习实战》
# -*- 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 "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实现的更多相关文章
- K近邻分类算法实现 in Python
K近邻(KNN):分类算法 * KNN是non-parametric分类器(不做分布形式的假设,直接从数据估计概率密度),是memory-based learning. * KNN不适用于高维数据(c ...
- 每日一个机器学习算法——k近邻分类
K近邻很简单. 简而言之,对于未知类的样本,按照某种计算距离找出它在训练集中的k个最近邻,如果k个近邻中多数样本属于哪个类别,就将它判决为那一个类别. 由于采用k投票机制,所以能够减小噪声的影响. 由 ...
- 查看neighbors大小对K近邻分类算法预测准确度和泛化能力的影响
代码: # -*- coding: utf-8 -*- """ Created on Thu Jul 12 09:36:49 2018 @author: zhen &qu ...
- 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法
(一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...
- Python机器学习基础教程-第2章-监督学习之K近邻
前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...
- 机器学习PR:k近邻法分类
k近邻法是一种基本分类与回归方法.本章只讨论k近邻分类,回归方法将在随后专题中进行. 它可以进行多类分类,分类时根据在样本集合中其k个最近邻点的类别,通过多数表决等方式进行预测,因此不具有显式的学习过 ...
- 基本分类方法——KNN(K近邻)算法
在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...
- (数据挖掘-入门-6)十折交叉验证和K近邻
主要内容: 1.十折交叉验证 2.混淆矩阵 3.K近邻 4.python实现 一.十折交叉验证 前面提到了数据集分为训练集和测试集,训练集用来训练模型,而测试集用来测试模型的好坏,那么单一的测试是否就 ...
- 数据挖掘算法(一)--K近邻算法 (KNN)
数据挖掘算法学习笔记汇总 数据挖掘算法(一)–K近邻算法 (KNN) 数据挖掘算法(二)–决策树 数据挖掘算法(三)–logistic回归 算法简介 KNN算法的训练样本是多维特征空间向量,其中每个训 ...
- 机器学习--K近邻 (KNN)算法的原理及优缺点
一.KNN算法原理 K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法. 它的基本思想是: 在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对 ...
随机推荐
- find 与 tar命令连用
find 与 tar命令连用 今天打包日志时,用 -type f -exec tar -cvf log.tar {} \; 发现只打包了最后一个文件,应该是tar的c参数,每次都创建一个新的文件,想了 ...
- 分析Hibernate的事务处理机制
Hibernate是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction处理功能的,Hibernate的 Transaction实际上是底层的JDBC Transactio ...
- jquery.dragsort实现列表拖曳、排序
在一次工作中需要将功能模块实现拖曳并且排序,并且将排序结果保存到数据库,用户下次登录后直接读取数据库排序信息进行显示.LZ找了好多插件,最后发现 jquery.dragsort 这款插件是最好使用的, ...
- 关于hibernate中双向外键关联one-to-one的property-ref=的问题(转)
大家都知道hibernate中的one-to-one映射主要有两种策略,(1)一对一主键关联(单向和双向).(2)一对一外键映射(单项和双向).本文主要讲解一下,一对一外键映射中的双向问题,在此前先通 ...
- 一个批量转换jtl文件的shell
最近在项目中遇到了批量转换jmeter测试结果jtl的问题,整了一个脚本,记录如下: #bin/sh filelist=`ls jtl` # 将jtl目录的所有文件列表读取并存入变量 for file ...
- ArcGIS学习记录—dbf shp shx sbn sbx mdb adf等类型的文件的解释
原文地址: ArcGIS问题:dbf shp shx sbn sbx mdb adf等类型的文件的解释 - Silent Dawn的日志 - 网易博客 http://gisman.blog.163.c ...
- win8 hyper-v 禁用不必卸载虚拟机
转载:http://tylzwp.blogbus.com/logs/232938121.html 禁用hyperv的目的是使用之前在用的VMware的虚拟机,不必重新处理一遍. 具体操作: 1确报之前 ...
- VS2005下开发PPC2003和WM50编译器一些设置
1.vs2005开发WM5时,编译器和linker的选项配合问题 链接:http://www.mivi.name/blog/index_en.php?itemid=258 首先说ARM4 ARM4T ...
- WPF程序中处理Windows消息
首先通过WindowInteropHelper类,我们可以获取WPF Window的Handle. WindowInteropHelper helper = new WindowInteropHelp ...
- mac tree命令
mac下默认是没有 tree命令的,不过我们可以使用find命令模拟出tree命令的效果,如显示当前目录的 tree 的命令: $ find . -print | sed -e 's;[^/]*/;| ...