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. JQGrid 导出Excel 获取筛选条件

    需求描述:页面加载后,进行相关数据搜索,要求点击导出按钮后  下载Excel文件. 思路:希望在点击[导出Excel]按钮时,获取到表格搜索时的filters内容. 在百度.api.jqgrid.js ...

  2. hdu 1253 胜利大逃亡(简单题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253 题目大意:在所给的时间能顺利离开城堡. #include <iostream> #i ...

  3. ew做socks5代理

    这个工具和之前讲过的xxoo类似.链接:https://www.cnblogs.com/nul1/p/8883271.html https://zhuanlan.zhihu.com/p/3282215 ...

  4. java===java基础学习(7)---用户自定义类

    package testbotoo; import java.util.*; public class EmployeeTest { public static void main(String[] ...

  5. python中的enumerate获取迭代元素的下标

    以前迭代的时候,需要获取次数都是如下格式: index=1 for node in nodes: if index==3: continue print(node.text_content())ind ...

  6. 【uva10779】收集者的难题

    按照题意建模就行了. #include<bits/stdc++.h> #define naive 0 #define inf 1000000007 using namespace std; ...

  7. aspxpopupcontrol弹出在aspxpivotgrid的下方

    ASPxPopupControl是DevPress控件集中非常优秀的控件之一,适用于弹出式窗口.对话窗口.信息提示窗口等的制作,甚至可用作拖放类的图片容器. 我设计时,想点击ASPxButtonEdi ...

  8. 流程控制--if条件

    /* if ....else .... */ [root@localhost test1]# vim .py //ADD #!/usr/bin/python >: print 'hello py ...

  9. Nginx-1.6.3反向代理

    源码安装nginx cat /etc/redhat-release uname -rm yum install pcre-devel openssl-devel -y rpm -qa pcre pcr ...

  10. 数据库简述(以MySQL为例)

    一.数据库中的概念 1.数据库是用户存放数据.访问数据.操作数据的存储仓库,用户的各种数据被有组织地存放在数据库中.可以随时被有权限的用户查询.统计.添加.删除和修改.可以说,数据库是长期存储在计算机 ...