k-近邻算法 简单例子
from numpy import *
import operator def create_data_set(): # 训练集与标签
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels group, labels = create_data_set() def classify0(inX, data_set, labels, k): # inX 待分类向量 data_set训练集 labels标签向量 k最相近邻居的数目 计算距离
# for 循环前步骤用于计算距离 距离公式:d = ((xA - xB)**2 + (yA - yB)**2)**0.5
data_set_size = data_set.shape[0] # 阵列的行数
diff_mat = tile(inX, (data_set_size, 1)) - data_set # 待分类向量 - 训练集中每行阵列 相当于计xA - xB,yA - yB
sq_diff_mat = diff_mat ** 2 # 阵列平方,就是阵列每个对应数字平方 ,相当于将上一步的差平方(xA - xB)**2
sq_distances = sq_diff_mat.sum(axis=1) # 求和(xA - xB)**2 + (yA - yB)**2
distances = sq_distances ** 0.5 # 开方,得到距离 ((xA - xB)**2 + (yA - yB)**2)**0.5
sorted_dist_indicies = distances.argsort() # 根据距离从小到大排序排序,显示为对应索引
class_count = {}
for i in range(k): # 选择距离最小的k个点
vote_ilabel = labels[sorted_dist_indicies[i]] # 从距离最近的开始取对应的索引,根据标签[索引]得到对应标签
class_count[vote_ilabel] = class_count.get(vote_ilabel, 0) + 1 # 字典中有该标签,则count+1,没有就新建
sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True) # 降序排序
return sorted_class_count
def file2matrix(filename): # 文本记录转换为numpy解析程序
fr = open(filename)
array_of_lines = fr.readlines()
number_of_lines = len(array_of_lines) # 得到文件行数
return_mat = zeros((number_of_lines, 3)) # 创建用零填充的矩阵
class_label_vector = []
for index, line in enumerate(array_of_lines):
line = line.strip()
list_fromline = line.split('\t')
return_mat[index, :] = list_fromline[0:3]
class_label_vector.append(int(list_fromline[-1]))
return return_mat, class_label_vector def autoNorm(data_set): # 数据归一化(不归一化处理会使数据值大的对结果的影响远远大于其他值)
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 - tile(min_vals, (m, 1))
norm_data_set = norm_data_set / tile(ranges, (m, 1)) # 特征值相除
return norm_data_set, ranges, min_vals def datingClassTest(): # 测试,得出错误率
ho_ratio = 0.10
dating_data_mat, dating_labels = file2matrix('datingTestSet2.txt') # 读取文档生成训练集和标签
norm_mat, ranges, min_vals = autoNorm(dating_data_mat) # 进行归一化,生成①新矩阵,②max-min ③min
m = norm_mat.shape[0] # 行数
num_test_vecs = int(m * ho_ratio)
error_count = 0
for i in range(num_test_vecs):
classifier_result = classify0(norm_mat[i, :], norm_mat[num_test_vecs:m, :], dating_labels[num_test_vecs:m], 4)
print('the classifier came back with:%s,the real answer is : %s' % (classifier_result, dating_labels[i]))
if (classifier_result != dating_labels[i]): error_count += 1.0
print('the total error rate is :%f' % (error_count / float(num_test_vecs))) def classifyPerson(): # 用户交互的预测函数
result_list = ['not at all', 'in small doses', 'in large doses']
percent_tats = float(input('玩电子游戏的时间百分比?'))
ff_miles = float(input('每年的飞行里程?'))
ice_cream = float(input('每年消费的冰淇淋量?'))
dating_data_mat,dating_labels = file2matrix('datingTestSet2.txt') # 读取文档生成训练集和标签
norm_mat, ranges, minvals = autoNorm(dating_data_mat) # 进行归一化,生成①新矩阵,②max-min ③min
in_arr = array([ff_miles,percent_tats, ice_cream]) # 根据用户输入建立矩阵
classifier_result = classify0((in_arr-minvals)/ranges,norm_mat,dating_labels,3)
print('You will probably like this person:',result_list[classifier_result-1])
# 识别手写数字
def img2vector(filename): # 将图像转换成向量
return_vect = zeros((1, 1024)) # 创建用零填充的矩阵
fr = open(filename)
for i in range(32):
line_str = fr.readline()
for j in range(32):
return_vect[0, 32 * i + j] = int(line_str[j])
return return_vect def handwritingClassTest():
hw_labels =[]
training_file_list = listdir('trainingDigits') # 获取训练目录内容
m = len(training_file_list) # 目录文件数
training_mat = zeros((m, 1024)) # 用零填充m行 1024列的矩阵
for i in range(m):
file_name_str = training_file_list[i] # 取出目录内的文件名
file_str = file_name_str.split('.')[0]
class_num_str = int(file_str.split('_')[0]) # 根据文件名提取出标签类型
hw_labels.append(class_num_str)
training_mat[i,:] = img2vector('trainingDigits\%s' % file_name_str) # 利用上面的函数将该文件转换为向量并复制给矩阵
test_file_list = listdir('testDigits') # 获取测试文件内容
error_count = 0.0
m_test = len(test_file_list) # 获取测试文件数目
for i in range(m_test):
file_name_str = test_file_list[i]
file_str = file_name_str.split('.')[0]
class_num_str = int(file_str.split('_')[0])
vector_under_test = img2vector('testDigits\%s' % file_name_str)
classifier_result = classify0(vector_under_test,training_mat,hw_labels,3)
print('the classifier came back with : %s,the real answer is : %s'% (classifier_result,class_num_str))
if classifier_result != class_num_str:
error_count += 1.0
print('\n the total number of errors is : %s '% error_count)
print('\n the total error rate is : %s' % (error_count/float(m_test)))
k-近邻算法 简单例子的更多相关文章
- [Machine-Learning] K临近算法-简单例子
k-临近算法 算法步骤 k 临近算法的伪代码,对位置类别属性的数据集中的每个点依次执行以下操作: 计算已知类别数据集中的每个点与当前点之间的距离: 按照距离递增次序排序: 选取与当前点距离最小的k个点 ...
- k近邻算法
k 近邻算法是一种基本分类与回归方法.我现在只是想讨论分类问题中的k近邻法.k近邻算法的输入为实例的特征向量,对应于特征空间的点,输出的为实例的类别.k邻近法假设给定一个训练数据集,其中实例类别已定. ...
- 从K近邻算法谈到KD树、SIFT+BBF算法
转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...
- 机器学习——KNN算法(k近邻算法)
一 KNN算法 1. KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分 ...
- <转>从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
转自 http://blog.csdn.net/likika2012/article/details/39619687 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经 ...
- 用Python从零开始实现K近邻算法
KNN算法的定义: KNN通过测量不同样本的特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.K通 ...
- 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
转载自:http://blog.csdn.net/v_july_v/article/details/8203674/ 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说: ...
- 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!
1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...
- 02-16 k近邻算法
目录 k近邻算法 一.k近邻算法学习目标 二.k近邻算法引入 三.k近邻算法详解 3.1 k近邻算法三要素 3.1.1 k值的选择 3.1.2 最近邻算法 3.1.3 距离度量的方式 3.1.4 分类 ...
- 1.K近邻算法
(一)K近邻算法基础 K近邻(KNN)算法优点 思想极度简单 应用数学知识少(近乎为0) 效果好 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 图解K近邻算法 上图是以 ...
随机推荐
- VS开发工具 因插件问题导致 已停止工作 解决办法
解决方案如下:No1. 开始-->所有程序-->Microsoft Visual Studio 2012-->Visual Studio Tools-->VS2012 开发人员 ...
- HTML -- get与post提交方式的区别 -- (转)
在写代码过程中,get与post是两种不同的提交方式.下面,列举出两种方式的不同. 方法/步骤 get是从服务器上获取数据,post是向服务器传送数据. get是把参数数据队列加到提交表单的A ...
- ie8下a标签中的图片出现边框
1.ie8下a标签中的图片出现边框 <a href="#"><img src="horse.jpg"></a> 效果如图所示 ...
- monkey测试===什么是monkey测试(系列一)转
本文转自:http://www.cnblogs.com/liu-ke/p/4353926.html Monkey工具使用 一. 什么是Monkey Monkey是Android中的一个命令行工具,可以 ...
- Android UI 设计:pixel dip dpi sp density
1. px (pixels)像素 – 是像素,就是屏幕上实际的像素点单位. dip或dp (device independent pixels)设备独立像素,与设备屏幕有关. sp (scaled p ...
- elasticsearch使用Analyze API
curl -XGET 'localhost:9200/index_name/_analyze?pretty&field=type_name.field_name' -d 'Robots car ...
- AC日记——天天爱跑步 洛谷 P1600
天天爱跑步 思路: 树上差分+分层动态线段树: (伏地膜,跪烂xxy) 代码: #include <bits/stdc++.h> using namespace std; #define ...
- React Native - 5 ListView实现图文混排
首先在根目录下建一个images文件夹,准备好图片 准备datasource 准备图片资源 准备renderRow方法 记得要import相应的类,ListView, Image, Touchable ...
- IOS中div contenteditable=true无法输入 fastclick.js在点击一个可输入的div时,ios无法正常唤起输入法键盘
原文地址: https://blog.csdn.net/u010377383/article/details/79838562 前言 为了提升移动端click的响应速度,使用了fastclick.js ...
- CentOS7.5下gnome-terminal+vim的solarized配色方案
1.简介 Solarized是一款包括浅色和深色的配色方案,适用于很多应用,可以让你的应用看起来更加漂亮!官网地址:http://ethanschoonover.com/solarized 2.设置g ...