您的位置:首页 > 其它

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.py

modulefunction
knn.py使用python描述KNN算法
excel.py将excel格式数据集导入程序
tese.py10倍交叉验证和留一法交叉,验证分类精度

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

(全文完)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息