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-近邻算法 简单例子的更多相关文章

  1. [Machine-Learning] K临近算法-简单例子

    k-临近算法 算法步骤 k 临近算法的伪代码,对位置类别属性的数据集中的每个点依次执行以下操作: 计算已知类别数据集中的每个点与当前点之间的距离: 按照距离递增次序排序: 选取与当前点距离最小的k个点 ...

  2. k近邻算法

    k 近邻算法是一种基本分类与回归方法.我现在只是想讨论分类问题中的k近邻法.k近邻算法的输入为实例的特征向量,对应于特征空间的点,输出的为实例的类别.k邻近法假设给定一个训练数据集,其中实例类别已定. ...

  3. 从K近邻算法谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...

  4. 机器学习——KNN算法(k近邻算法)

    一 KNN算法 1. KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分 ...

  5. <转>从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/likika2012/article/details/39619687 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经 ...

  6. 用Python从零开始实现K近邻算法

    KNN算法的定义: KNN通过测量不同样本的特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.K通 ...

  7. 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    转载自:http://blog.csdn.net/v_july_v/article/details/8203674/ 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说: ...

  8. 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!

    1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...

  9. 02-16 k近邻算法

    目录 k近邻算法 一.k近邻算法学习目标 二.k近邻算法引入 三.k近邻算法详解 3.1 k近邻算法三要素 3.1.1 k值的选择 3.1.2 最近邻算法 3.1.3 距离度量的方式 3.1.4 分类 ...

  10. 1.K近邻算法

    (一)K近邻算法基础 K近邻(KNN)算法优点 思想极度简单 应用数学知识少(近乎为0) 效果好 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 图解K近邻算法 上图是以 ...

随机推荐

  1. javascript执行上下文学习一

    原文: http://web.jobbole.com/84044/ http://blog.csdn.net/github_34514750/article/details/52901781 1.三种 ...

  2. 一个简单插件this传值的跟踪

    <!DOCUTYPE html> <html> <head> <meta charset="UTF-8"> <script s ...

  3. Python 下调用C动态链接库 -- (转)

    在linux开发的动态链接库需要被python调用,首先需要生成.so文件. 生成动态链接库的方法网上有很多,主要就是首先根据源文件编译生成.o,然后链接这些.o文件-shared生成.so.需要注意 ...

  4. kndo grid:通过checkbox 实现多选和全选

    在kendo grid 里要想通过checkbox 实现多选和权限,我们就要通过templeate 和input 标签对kendo grid 进行自定义 1. 在column 里面加入一列checkb ...

  5. skb管理函数之skb_put、skb_push、skb_pull、skb_reserve

    四个操作函数直接的区别,如下图: /** * skb_put - add data to a buffer * @skb: buffer to use * @len: amount of data t ...

  6. Git 常用命令速查表(图文+表格)【转】

    转自:http://www.jb51.net/article/55442.htm 一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态 git comm ...

  7. codevs 1038 一元三次方程求解 NOIP2001提高组

    题目链接:http://codevs.cn/problem/1038/ 题解: 嗯,exm?才知道二分隶属搜索专题…… 对-100到100枚举,按照题目中的提示,当当fi*fi+1<0时,二分深 ...

  8. shell常见操作整理(更新)

    查看文件第20到30行的内容 法一:[root@oldboy ~]# seq 100 > ett.txt [root@oldboy ~]# head -30 ett.txt | tail -11 ...

  9. 高性能网络编程(1)—accept建立连接‍(待研究)

    阿里云博客上一篇感觉还不错的文章,待研究,原文链接如下: http://blog.aliyun.com/673?spm=5176.7114037.1996646101.3.oBgpZQ&pos ...

  10. ie6、ie7下overflow失效

    如果父对象有overflow:hidden属性,子对象中的position属性是relative或者absolute, 那么在ie6和ie7下父对象的overflow会失效,解决办法是给父对象加rel ...