KNN分类和估计分类器的精度
2016-11-21 22:41
239 查看
1. 简介:
a python book in Data mining 《Machine Learning in Action》.what is KNN? http://www.cnblogs.com/ybjourney/p/4702562.html
2. 要求描述
实现KNN分类器后,将k-nearest neighbors algorithm应用于数据集。此数据集为差异甲基化区域的数据. 计算10倍交叉验证(10-fold cross-validation)的分类精度,并且计算出留一法交叉验证(loocv)的分类精度。数据集描述 (数据集在文末给出)
ch02-dmr_data.xls (96*11),其中每一行是一个样本,每列代表一个属性
ch02-dmr_label.txt (1*96), 是样本标签,共96个样本,两个类别
3. 实现方案
设计三个模块 knn.py, excel.py, tese.pymodule | function |
---|---|
knn.py | 使用python描述KNN算法 |
excel.py | 将excel格式数据集导入程序 |
tese.py | 10倍交叉验证和留一法交叉,验证分类精度 |
execl.py moudle
// how to setup xlrd moudle? $ pip install --upgrade xlrd $ pip install --upgrade cutplace
#/usr/bin/env: python #coding: utf-8 ''' 从excel读入数据, 并定义每一个样本数据的类别 ''' import numpy as np import os from xlrd import open_workbook from numpy import * wb = open_workbook('ch02-dmr_data.xls') def excel_data(): items = [] sheet = wb.sheets()[0] #this sheet number_of_rows = sheet.nrows # 行数 number_of_columns = sheet.ncols # 列数 for row in range(0, number_of_rows): values = [] for col in range(number_of_columns): try: value = (sheet.cell(row,col).value) except ValueError: pass finally: values.append(value) items.append(values) #np矩阵方式保存训练数据集 data = ([]) data = np.array(items) #预测数据类别label labels = [] count = 0 fp = open("ch02-dmr_label.txt","r") for line in fp: line=line.strip('\n') labels.append(line) fp.close() return data, labels
knn.py moudle
#/usr/bin/env: python #coding: utf-8 from numpy import * import operator import excel #给出训练数据以及对应的类别 def createDataSet(): group,labels = excel.excel_data() return group, labels #通过KNN进行分类 def classify(input, dataSet,label,k): dataSize = dataSet.shape[0] #数组的维度 #1. 计算欧式距离 diff = tile(input, (dataSize, 1)) - dataSet # 矩阵运算 sqdiff = diff ** 2 squareDist = sum(sqdiff, axis = 1)##行向量分别相加,从而得到新的一个行向量 dist = squareDist ** 0.5 #2. 对距离进行排序 sortedDistIndex = argsort(dist) ##argsort()根据元素的值从大到小对元素进行排序,返回下标 #3. 选取距离最小的K个点 classCount={} for i in range(k): voteLabel = label[sortedDistIndex[i]] #4. 对选取的K个样本所属的类别个数进行统计 classCount[voteLabel] = classCount.get(voteLabel, 0) + 1 #5. 返回前K个点中出现频率最高的类别作为测试数据的预测分类 maxCount = 0 for key,value in classCount.items(): if value > maxCount: maxCount = value classes = key return classes
test.py moudle
#/usr/bin/env: python #coding: utf-8 import knn import numpy as np #dataSet 训练集合样本 #label 标签向量 #K KNN K #训练预测集 dataSet,labels= knn.createDataSet() #K K = 3 print ('\nK = %s' %(K)) #被预测样本 # 方法一:10倍交叉验证(10-fold cross-validation)的分类精度 # 分类:1~10 * 10。 待改进,采用随机分配策略 # z 表示 剔除待预测样本后的数据集 count2 = 0 for i in range(96): if i < 10: z = np.row_stack((dataSet[10:96])) elif i > 90: z = np.row_stack((dataSet[0:90])) else: a = dataSet[0:int(i/10 * 10)] b = dataSet[(int)((i/10 + 1) * 10):96] z = np.row_stack((a, b)) label = knn.classify(dataSet[i], z, labels, K) if label == labels[i]: count2 = count2 + 1 print ('10-fold cross-validation精确度: %s' %(count2 * 1.0 / 96)) # 方法二: 留一交叉验证 count1 = 0 for i in range(96): z = np.row_stack((dataSet[0:i], dataSet[i+1:96])) #print z.shape label = knn.classify(dataSet[i], z, labels, K) if label == labels[i]: count1 = count1 + 1 print ('Leave-1-out cross-validation精确度: %s\n' %(count1 * 1.0 / 96))
4. 预测数据集
ch02-dmr_data.xls (96*11),其中每一行是一个样本,每列代表一个属性。Tip: 保存数据到excel,命名为
ch02-dmr_data.xls,与
excel.py,
knn.py,
test.py放在同一目录下
1.00 0.00 1.00 0.00 0.26 0.00 0.00 0.00 0.00 0.00 0.00 9.00 0.50 9.00 0.00 0.29 0.00 0.00 0.00 0.00 0.00 0.00 139.00 0.07 40.00 0.00 0.38 0.10 0.00 0.01 0.01 0.01 0.01 17.00 0.07 13.00 0.00 0.32 0.01 0.00 0.06 0.00 0.00 0.00 16.00 0.43 15.00 0.00 0.32 0.01 0.00 0.00 0.00 0.00 0.06 5.00 0.20 5.00 0.00 0.32 0.01 0.00 0.00 0.00 0.00 0.00 36.00 0.15 22.00 0.00 0.33 0.03 0.00 0.00 0.00 0.00 0.03 36.00 0.15 22.00 0.00 0.33 0.03 0.00 0.00 0.00 0.00 0.03 36.00 0.15 22.00 0.00 0.33 0.03 0.00 0.00 0.00 0.00 0.03 36.00 0.15 22.00 0.00 0.33 0.03 0.00 0.00 0.00 0.00 0.03 18.00 0.18 17.00 0.00 0.32 0.01 0.00 0.00 0.06 0.00 0.00 13.00 0.09 11.00 0.00 0.33 0.01 0.00 0.00 0.00 0.00 0.00 11.00 0.09 11.00 0.00 0.32 0.01 0.00 0.00 0.00 0.00 0.00 3.00 0.00 3.00 0.00 0.32 0.01 0.00 0.00 0.00 0.00 0.00 35.00 0.18 31.00 0.00 0.35 0.05 0.00 0.00 0.00 0.00 0.00 31.00 0.13 24.00 0.00 0.34 0.03 0.00 0.00 0.00 0.00 0.00 16.00 0.04 11.00 0.00 0.31 0.01 0.00 0.06 0.00 0.00 0.00 6.00 0.13 6.00 0.00 0.30 0.00 0.00 0.00 0.00 0.00 0.00 6.00 0.13 6.00 0.00 0.30 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 1.00 0.00 0.27 0.00 0.00 0.00 0.00 0.00 0.00 7.00 0.05 5.00 0.00 0.28 0.00 0.00 0.00 0.00 0.00 0.00 141.00 0.40 58.00 0.00 0.38 0.19 0.00 0.00 0.00 0.00 0.00 22.00 0.06 17.00 0.00 0.33 0.02 0.00 0.00 0.00 0.00 0.00 14.00 0.21 13.00 0.00 0.31 0.01 0.00 0.00 0.00 0.00 0.00 125.00 0.06 38.00 0.00 0.36 0.08 0.00 0.00 0.00 0.00 0.01 29.00 0.10 21.00 0.00 0.33 0.01 0.00 0.00 0.00 0.00 0.00 2.00 0.00 2.00 0.00 0.28 0.00 0.00 0.00 0.00 0.00 0.00 4.00 0.17 4.00 0.00 0.28 0.00 0.00 0.00 0.00 0.00 0.00 6.00 0.07 6.00 0.00 0.29 0.00 0.00 0.00 0.00 0.00 0.00 29.00 0.08 19.00 0.00 0.32 0.01 0.00 0.00 0.03 0.00 0.00 48.00 0.24 38.00 0.00 0.36 0.07 0.00 0.00 0.00 0.00 0.00 157.00 0.05 41.00 0.00 0.36 0.10 0.00 0.00 0.00 0.00 0.00 52.00 0.06 19.00 0.00 0.35 0.03 0.00 0.00 0.00 0.00 0.02 30.00 0.10 23.00 0.00 0.34 0.02 0.00 0.00 0.03 0.00 0.00 5.00 0.10 5.00 0.00 0.29 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.03 33.00 0.00 0.36 0.06 0.00 0.00 0.00 0.00 0.00 54.00 0.10 30.00 0.00 0.35 0.04 0.00 0.00 0.00 0.00 0.00 10.00 0.27 10.00 0.00 0.31 0.01 0.00 0.00 0.00 0.00 0.00 15.00 0.09 12.00 0.00 0.30 0.00 0.00 0.00 0.00 0.00 0.07 4.00 0.00 4.00 0.00 0.30 0.00 0.00 0.00 0.00 0.00 0.00 32.00 0.16 26.00 0.00 0.33 0.03 0.00 0.00 0.00 0.00 0.00 25.00 0.50 23.00 0.00 0.32 0.02 0.00 0.00 0.00 0.00 0.00 118.00 0.08 40.00 0.00 0.37 0.09 0.00 0.00 0.01 0.00 0.00 14.00 0.02 12.00 0.00 0.30 0.00 0.00 0.00 0.00 0.00 0.00 35.00 0.06 19.00 0.00 0.32 0.01 0.00 0.00 0.00 0.03 0.00 38.00 0.18 25.00 0.00 0.35 0.03 0.00 0.00 0.00 0.00 0.00 280.00 0.04 42.00 0.00 0.39 0.16 0.00 0.01 0.00 0.00 0.00 3.00 0.00 3.00 0.00 0.32 0.01 0.00 0.00 0.00 0.00 0.00 3.00 0.00 2.00 0.00 0.25 0.00 0.00 0.00 0.00 0.00 0.00 24.00 0.08 16.00 0.00 0.32 0.01 0.00 0.00 0.04 0.00 0.00 6.00 0.13 4.00 0.00 0.29 0.00 0.00 0.00 0.00 0.00 0.00 12.00 0.02 11.00 0.00 0.30 0.00 0.00 0.00 0.00 0.00 0.00 2.00 0.00 2.00 0.00 0.30 0.00 0.00 0.00 0.00 0.00 0.00 5.00 0.50 5.00 0.00 0.30 0.01 0.00 0.00 0.00 0.00 0.00 25.00 0.24 23.00 0.00 0.33 0.02 0.00 0.00 0.00 0.00 0.04 7.00 0.10 5.00 0.00 0.30 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 1.00 0.00 0.28 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 1.00 0.00 0.29 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 7.00 0.00 0.29 0.00 0.00 0.00 0.13 0.00 0.00 4.00 0.00 4.00 0.00 0.29 0.00 0.00 0.00 0.00 0.00 0.00 4.00 0.00 4.00 0.00 0.29 0.00 0.00 0.00 0.00 0.00 0.00 7.00 0.24 7.00 0.00 0.31 0.01 0.00 0.00 0.14 0.00 0.00 3.00 0.33 2.00 0.00 0.26 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 1.00 0.00 0.21 0.00 0.00 0.00 0.00 0.00 0.00 113.00 0.07 42.00 0.00 0.37 0.10 0.00 0.00 0.00 0.00 0.00 29.00 0.05 22.00 0.00 0.33 0.02 0.00 0.00 0.00 0.00 0.00 28.00 0.09 19.00 0.00 0.33 0.01 0.00 0.00 0.04 0.00 0.00 9.00 0.08 6.00 0.00 0.33 0.01 0.00 0.00 0.00 0.00 0.00 1.00 0.00 1.00 0.00 0.28 0.00 0.00 0.00 0.00 0.00 0.00 15.00 0.01 10.00 0.00 0.30 0.00 0.00 0.00 0.00 0.00 0.00 22.00 0.19 21.00 0.00 0.33 0.02 0.00 0.00 0.05 0.00 0.00 12.00 0.11 10.00 0.00 0.33 0.01 0.00 0.00 0.00 0.00 0.00 91.00 0.02 30.00 0.00 0.35 0.04 0.00 0.00 0.01 0.00 0.00 49.00 0.10 27.00 0.00 0.34 0.02 0.00 0.00 0.00 0.00 0.00 1.00 0.00 1.00 0.00 0.29 0.00 0.00 0.00 0.00 0.00 0.00 31.00 0.05 21.00 0.00 0.34 0.02 0.00 0.00 0.00 0.00 0.00 20.00 0.24 18.00 0.00 0.34 0.02 0.00 0.00 0.00 0.00 0.00 16.00 0.08 14.00 0.00 0.32 0.01 0.00 0.00 0.06 0.00 0.00 21.00 0.09 19.00 0.00 0.32 0.01 0.00 0.00 0.00 0.00 0.05 78.00 0.13 38.00 0.00 0.36 0.08 0.00 0.00 0.00 0.00 0.00 18.00 0.15 17.00 0.00 0.32 0.01 0.00 0.00 0.00 0.00 0.00 17.00 0.07 10.00 0.00 0.30 0.00 0.00 0.00 0.00 0.00 0.00 5.00 0.20 4.00 0.00 0.32 0.01 0.00 0.00 0.00 0.00 0.00 1.00 0.00 1.00 0.00 0.24 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 1.00 0.00 0.31 0.01 0.00 0.00 0.00 0.00 0.00 44.00 0.06 22.00 0.00 0.32 0.02 0.00 0.00 0.00 0.00 0.00 12.00 0.11 12.00 0.00 0.32 0.01 0.00 0.00 0.00 0.00 0.00 12.00 0.11 12.00 0.00 0.32 0.01 0.00 0.00 0.00 0.00 0.00 30.00 0.06 21.00 0.00 0.34 0.02 0.00 0.00 0.00 0.00 0.00 6.00 0.07 4.00 0.00 0.27 0.00 0.00 0.00 0.00 0.00 0.00 6.00 0.27 6.00 0.00 0.28 0.00 0.00 0.00 0.00 0.00 0.00 9.00 0.08 6.00 0.00 0.30 0.00 0.00 0.00 0.00 0.00 0.00 20.00 0.07 17.00 0.00 0.34 0.03 0.00 0.00 0.00 0.00 0.00 16.00 0.08 13.00 0.00 0.34 0.01 0.00 0.00 0.00 0.00 0.00 12.00 0.08 12.00 0.00 0.32 0.01 0.00 0.08 0.00 0.00 0.00 50.00 0.11 28.00 0.00 0.35 0.04 0.00 0.00 0.00 0.00 0.00
ch02-dmr_label.txt (1*96), 是样本标签,共96个样本,两个类别。
Tip: 保存数据到txt,命名为
ch02-dmr_label.txt,与
excel.py,
knn.py,
test.py放在同一目录下
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
5. 结果输出
ubuntu16.04 ,Python 2.7.12
win10,
Python 3.5.0
K值不同,结果也不同,K is best value in 0 ~ 20.
6. 值得注意的地方
python tabs and space?在vim中使用
space缩进,最好保持
space,而不要使用
tabs;
python:
print ()加括号输出会更好;
处理数据时注意格式的转换;
对数据进行归一化处理,剔除相关性差的数据。
参考文献
https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm(全文完)
相关文章推荐
- 图像分类基本流程及 KNN 分类器
- 基于lsh的增量学习分类器、海量数据分类处理复杂度O(1)准确度超越KNN
- 用scikit-learn估计值分类——近邻算法(KNN)
- 【机器学习】KNN分类
- 机器学习实战-kNN分类手写数字笔记
- kNN分类算法
- Stanford cs231n笔记(一)KNN和线性分类器
- kNN(K-Nearest Neighbor)最邻近规则分类中的三大问题(K值选取、距离度量、分类决策规则)
- 基于朴素贝叶斯分类器的文本分类算法(C语言)
- 4.2 最近邻规则分类算法(KNN)应用
- [模式分类] Parzen窗概率密度估计与Kn近邻概率密度估计
- kNN(K-Nearest Neighbor)最邻近规则分类
- CS231n学习笔记1-图像分类,KNN
- 机器学习 —— 基础整理(二)朴素贝叶斯分类器;文本分类的方法杂谈
- sklearn-4 使用knn对iris花进行分类预测
- python起步之knn分类算法(三)
- 基于图像的室内装修风格分类系统(四)---分类器
- 数据挖掘-分类-KNN
- 《机器学习实战》代码记录--knn--约会对象分类
- KNN分类算法的实现