机器学习之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的取值,错误率大概在百分之五左右。
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析