您的位置:首页 > 其它

机器学习之1.1——kNN实践

2016-05-27 14:19 225 查看

概述

这是Machine Learning in Action 里面的例子,简单地使用kNN算法进行分类,代码和数据可以在这里找到:http://git.oschina.net/xuhangyi/ML

算法过程

归一化数据

因为不同的数据其绝对值可能差别很大,因此对于距离的计算会有很大的影响,因而需要对数据进行归一化,使他们的取值都在0-1之间。

这里简单地认为三个维度的数据的权值都是一致的,因此都归一化到0-1之间,如果认为有不同的权值可以做不同的处理。

归一化公式:

new_val = (old_val - min)/(max-min)


归一化代码:

# kNN.py
def auto_norm(data_set):
#  把矩阵归一化,yeah!,这里可以对不同的权值进行处理喽?
#  这里处理是认为所有的几个变量的权值是一致的
#  归一化公式:new_val = (old_val - min)/(max - min)
min_vals = data_set.min(0)
max_vals = data_set.max(0)  # 分别是一列中的最大值们和最小值们
ranges = max_vals - min_vals
m = data_set.shape[0]
norm_data_set = data_set - np.tile(min_vals, (m, 1))
norm_data_set = norm_data_set / np.tile(ranges, (m, 1))
return norm_data_set, ranges, min_vals


进行分类

为了对分类器进行测试,我们仅仅选取其中的百分之九十的数据作为训练集,而使用其中百分之十的数据用来测试我们实现的分类器。

分类器的代码:

# kNN.py
def dating_class_test():
train_ration = 0.10  # 训练的比例,百分之十的数据用于测试
data_matrix, data_labels = file2matrix('./data/datingTestSet.txt')
norm_matrix, ranges, min_vals = auto_norm(data_matrix)  # 得到归一化之后的矩阵
m = norm_matrix.shape[0]  # 数据集的总的列数
num_test_vecs = int(m * train_ration)  # 用于测试的数据数目,百分之十
error_count = 0.0  # 出错的数目
for i in range(num_test_vecs):
classify_result = classify0(norm_matrix[i],  # 测试的数据,前百分之十的数据中的一列
norm_matrix[num_test_vecs:m, :],  # 用于分类的数据,二维矩阵中后面的百分之九十
data_labels[num_test_vecs:m], 3)  # 用于分类的类别,类别中后面的百分之九十,还有3是k
print 'the classifier came back with: %d, the real answer is: %d' % \
(classify_result, data_labels[i])
if classify_result != data_labels[i]:
error_count += 1.0
print 'the total error rate is: %f' % (error_count / float(num_test_vecs))


运行代码:

# run.py
import kNN

kNN.dating_class_test()


改变k的取值,错误率大概在百分之五左右。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息