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)是一种很基本的机器学习方法. 它的基本思想是: 在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对 ...
随机推荐
- 关闭MyEclipse的Quick Update
关闭MyEclipse的Quick Update, Windows > Preferences > MyEclipse > Community Essentials, 把选项 &qu ...
- CrackMe_001
本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注册机的东西. 其中,文章中按照如下逻辑编排(解决如 ...
- python调试总结
调试通常采用两种方式,打印日志调试以及运行时实时跟踪调试. 一.打印日志: 1. print不要看不起print,这是一切调试的起点,即便是调试Java或者C这种巨麻烦的编译语言,print仍然是常用 ...
- POJ 2318 TOYS && POJ 2398 Toy Storage(几何)
2318 TOYS 2398 Toy Storage 题意 : 给你n块板的坐标,m个玩具的具体坐标,2318中板是有序的,而2398无序需要自己排序,2318要求输出的是每个区间内的玩具数,而231 ...
- HDU1437+模拟
枚举中间可能出现的天气 #include<stdio.h> #include<string.h> #include<stdlib.h> ; ][ ]; void s ...
- java I/O Stream 代码学习总结
一. InputStream 类学习介绍 mark方法 public void mark(int readlimit) 在此输入流中标记当前的位置.对 reset 方法的后续调用会在最后标记的位置重新 ...
- 使用typeid(变量或类型).name()来获取常量或变量的类型---gyy整理
使用typeid(变量或类型).name()来获取常量或变量的类型 <typeinfo> 该头文件包含运行时类型识别(在执行时确定数据类型)的类 typeid的使用 typeid操作 ...
- Web开发的绝美网站
http://paranimage.com/ http://sixrevisions.com/graphics-design/
- Android EditText属性
1.EditText输入的文字为密码形式的设置 (1)通过.xml里设置: 把该EditText设为:android:password="true" // 以”.”形式显示文本 ( ...
- R语言学习笔记:矩阵与数组(array)
元素可以保存在多个维度的对象中,数组存储的是多维数据元素,矩阵的是数组的特殊情况,它具有两维. 创建数组的几种方法. 1. > m<-c(45,23,66,77,33,44,56,12,7 ...