1:使用机器学习实战中的knn算法对 普通样本进行了分类
2:分别使用该算法与scikit_learning中的knn 进行了手写数字的对比,发现scikit_learning分类很慢
实现的功能:
1、对样本特征为[x1,x2,.....,xn-1,y],其中共有n-1个特征,1个y标签 进行knn样本分类
部分数据截图:
knn.py
import numpy as np
import operator
def classify0(inX, dataset, labels, k):
"""
inX 是输入的测试样本,是一个[x1, x2,......]样式的
dataset 是训练样本集
labels 是训练样本标签
k 是top k最相近的
"""
dataSetSize = dataset.shape[0]
diffMat = np.tile(inX, (dataSetSize, 1)) - dataset
sqDiffMat = diffMat ** 2
sqDistance = sqDiffMat.sum(axis=1)
distance = sqDistance ** 0.5
sortedDistIndicies = distance.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
#classCount.get(voteIlabel, 0) classCount中有 voteIlabel,则取出classCount[voteIlabel]的值,否则为置为0
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
#从大到小的排序
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
#返回[('B', 2), ('A', 1)]中最大的
return sortedClassCount[0][0]
def file2matrix(filename):
"""
从文件中读入训练数据,并存储为矩阵
针对样本特征为n-1个样本特征,1个样本标签 [x1,x2,x3,....,xn-1,y]
"""
fr = open(filename)
arrayOlines = fr.readlines()
numberOfLines = len(arrayOlines) #获取 n=样本的行数
numberOffeatures = len(arrayOlines[0].split('\t')) - 1
print(numberOffeatures)
returnMat = np.zeros((numberOfLines,numberOffeatures)) #创建一个2维矩阵用于存放训练样本数据,一共有n行,每一行存放3个数据
classLabelVector = [] #创建一个1维数组用于存放训练样本标签。
index = 0
for line in arrayOlines:
# 把回车符号给去掉
line = line.strip()
# 把每一行数据