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. 【swupdate文档 二】许可证

    许可证 SWUpdate是免费软件.它的版权属于Stefano Babic和其他许多贡献代码的人(详情请参阅实际源代码和git提交信息). 您可以根据自由软件基金会发布的GNU通用公共许可证第2版的条 ...

  2. android 内核调试

    这篇文档给出使用android emulator 和 arm-linux-androideabi-gdb 调试 android kernel 的方法 1. checkout goldfish 源码: ...

  3. ue4.3正式版源码链接

    ue4.3正式版源码链接 http://tieba.baidu.com/p/3170253742

  4. VO、DTO、DO、PO的概念、区别和用处

    转至:http://qixuejia.cnblogs.com/ 本篇文章主要讨论一下我们经常会用到的一些对象:VO.DTO.DO和PO. 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概 ...

  5. 动画基础--基于Core Animation(1)

    1.简介 上一篇文章[New learn]动画-基于UIView了解到了一些直接由UIView这个在UIKIT提供的类中提供的一些动画方法. 使用UIView的动画特性已经能够满足我们很多的需求,它是 ...

  6. 解决 :java -version出现错误:“could not open `C:\Program Files\Java\jre7\lib\amd64\jvm.cfg”

    cmd 下java -version出现错误:“could not open `C:\Program Files\Java\jre7\lib\amd64\jvm.cfg”,出现这种错误可能是由于先前有 ...

  7. 根据节点解析xml

    config.xml文件如下: <?xml version="1.0" encoding="gb2312" ?> <root> < ...

  8. form表单 datalist 和legend

    <form action="" method="post" > <fieldset> <legend> 表单元素 </ ...

  9. JVM字节码执行引擎和动态绑定原理

    1.执行引擎 所有Java虚拟机的执行引擎都是一致的: 输入的是字节码文件,处理过程就是解析过程,最后输出执行结果. 在整个过程不同的数据在不同的结构中进行处理. 2.栈帧 jvm进行方法调用和方法执 ...

  10. hdu 2818(并查集,带权更新)

    Building Block Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...