《机器学习实战》中的程序清单2-1 k近邻算法(kNN)classify0都做了什么
from numpy import *
import operator
import matplotlib
import matplotlib.pyplot as plt
from imp import *
#from os import *
import os reload(operator) def start():
group,labels = createDataSet()
testSample = [5,7]
print("测试样本:" ,end="")
print(testSample) return classify0(testSample, group, labels, 4) def createDataSet(): group = array([[1,2],[2,3],[1,1],[4,5]]) #此处随意定义,表示一个已知的已分类的数据集
labels = ['A','A','B','B'] #例如
#group = array([[1,2],[2,3],[1,1],[4,5],[5,7],[6,6]]) #此处随意定义,表示一个已知的已分类的数据集
#labels = ['A','A','B','B','C','C'] return group, labels def classify0(inX, dataSet, labels, k):
"""
inX 是输入的测试样本,是一个[x, y]样式的
dataset 是训练样本集
labels 是训练样本标签
k 是top k最相近的
""" # 矩阵的shape是个tuple,如果直接调用dataSet.shape,会返回(4,2),即
# 返回矩阵的(行数,列数),
# 那么shape[0]获取数据集的行数,
# 行数就是样本的数量
# shape[1]返回数据集的列数
dataSetSize = dataSet.shape[0] ###################说明代码########################
#print("dataSet.shape[0]返回矩阵的行数:")
#print(dataSetSize)
#print("dataSet.shape[1]返回矩阵的列数:")
#cols = dataSet.shape[1]
#print(cols)
#print(dataSet.shape)
#print("dataSet.shape类型:")
#print(type(dataSet.shape))
################################################### #此处Mat是Maxtrix的缩写,diffMat,即矩阵的差,结果也是矩阵
#关于tile函数的说明,见http://www.cnblogs.com/Sabre/p/7976702.html
#简单来说就是把inX(本例是[1,1])在“行”这个维度上,复制了dataSetSize次(本例dataSetSize==4),在“列”这个维度上,复制了1次
#形成[[1,1],[1,1],[1,1],[1,1]]这样一个矩阵,以便与dataSet进行运算
#之所以进行这样的运算,是因为要使用欧式距离公式求输入点与已存在各点的距离 #这是第1步,求给出点[1,1]与已知4点的差,输出为矩阵
diffMat = tile(inX,(dataSetSize,1)) - dataSet
#print(tile(inX,(dataSetSize,1))) ###################说明代码########################
#print("diffMat:" + str(diffMat))
################################################### #第2步,对矩阵进行平方,即,求差的平方
sqDiffMat = diffMat ** 2 ###################说明代码########################
#print("sqDiffMat:" + str(sqDiffMat))
#print("sqDiffMat",end="")
#print(sqDiffMat[324])
################################################### #sum(axis=1)是将矩阵中每一行中的数值相加,如[[0 0] [1 1] [0 1] [9 9]]将得到[0,2,1,18],得到平方和
#sum(axis=0)是将矩阵中每一列中的数值相加
#第3步,求和
sqDistances = sqDiffMat.sum(axis=1)
#print("sqDistances:", end="")
#print(sqDistances[875]) ###################说明代码########################
#print("sqDistances:" + str(sqDistances))
################################################### #第4步,将平方和进行开方,得到距离,输出为数组
distances = sqDistances ** 0.5 ###################说明代码########################
#print("未知点到各个已知点的距离:",distances)
################################################### #argsort(),将数组中的元素的索引放在由小到大的位置上由小到大排序
#如数组a = array([ 0 4 3 18]),b = a.argsort()之后,得到b是[0 2 1 3]这是a的索引数组,最小的在最前面,位置0,第二小的是索引为2的元素,即3,3在数组中的位置是2
#第三小的是索引为1的,即4,4在数组中的索引位置是2,第四小的是索引为3的,即18
#这样保证了原数组元素的位置不变,以便进行标签的匹配
#print(distances[875])
#print(distances[324])
#print(distances[392])
sortedDistIndicies = distances.argsort() ###################说明代码########################
#print("索引位置:", sortedDistIndicies) #可得到前k个索引
################################################### #创建空字典
classCount = {} #k值是取前k个样本进行比较
for i in range(k):
#返回distances中索引为sortedDistIndicies[i]的值
#此例中分别为:
#sortedDistIndicies[0]==0,则labels[0]=='A',voteIlabel=='A'
#sortedDistIndicies[1]==2,则labels[2]=='B',voteIlabel=='B'
#sortedDistIndicies[2]==1,则labels[0]=='A',voteIlabel=='A'
#sortedDistIndicies[3]==18,则labels[0]=='B',voteIlabel=='B' voteIlabel = labels[sortedDistIndicies[i]]
#print("中华人民共和国")
###################说明代码######################## # print(voteIlabel)
# print("标签" + str(i) + ":" + str(voteIlabel))
################################################### #dict.get(key, default=None),对于键 key 返回其对应的值,或者若 dict 中不含 key 则返回 default(注意, default的默认值为 None,此处设置为0)
#第一次调用classCount.get时,classCount内还没有值
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 ###################说明代码########################
# print("第"+str(i+1)+"次访问,classCount[" + str(voteIlabel) + "]值为:" + str(classCount[voteIlabel]))
# print("classCount的内容为:")
# print(classCount)
################################################### # sorted(iterable[,cmp,[,key[,reverse=True]]])
# 作用:Return a new sorted list from the items in iterable.
# 第一个参数是一个iterable,返回值是一个对iterable中元素进行排序后的列表(list)。
# 可选的参数有三个,cmp、key和reverse。
# 1)cmp指定一个定制的比较函数,这个函数接收两个参数(iterable的元素),如果第一个参数小于第二个参数,返回一个负数;如果第一个参数等于第二个参数,返回零;如果第一个参数大于第二个参数,返回一个正数。默认值为None。
# 2)key指定一个接收一个参数的函数,这个函数用于从每个元素中提取一个用于比较的关键字。默认值为None。
# 从python2.4开始,list.sort()和sorted()函数增加了key参数来指定一个函数,此函数将在每个元素比较前被调用
# key参数的值为一个函数,此函数只有一个参数且返回一个值用来进行比较。这个技术是快速的,因为key指定的函数将准确地对每个元素调用。
# key=operator.itemgetter(0)或key=operator.itemgetter(1),决定以字典的键排序还是以字典的值排序
# 0以键排序,1以值排序
# 3)reverse是一个布尔值。如果设置为True,列表元素将被倒序排列。
# operator.itemgetter(1)这个很难解释,用以下的例子一看就懂
# a=[11,22,33]
# b = operator.itemgetter(2)
# b(a)
# 输出:33
# b = operator.itemgetter(2,0,1)
# b(a)
# 输出:(33,11,22)
# operator.itemgetter函数返回的不是值,而是一个函数,通过该函数作用到对象上才能获取值
# 在这里itemgetter(1)的作用是按照第二个元素的顺序对元组进行排序,也就是value的顺序,如果改成itemgetter(0),则根据Key值排序
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1), reverse=True)
#print(sortedClassCount)
#返回正序排序后最小的值,即“k个最小相邻”的值决定测试样本的类别
print("最终结果,测试样本类别:" , end="")
print(sortedClassCount)
return sortedClassCount[0][0]
以下为输出结果,未必完全一致,请自行调试。
输出结果:
| dataSet.shape[0]返回矩阵的行数:
dataSet.shape[1]返回矩阵的列数: (4, 2) |
《机器学习实战》中的程序清单2-1 k近邻算法(kNN)classify0都做了什么的更多相关文章
- 机器学习实战 - python3 学习笔记(一) - k近邻算法
一. 使用k近邻算法改进约会网站的配对效果 k-近邻算法的一般流程: 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据.一般来讲,数据放在txt文本文件中,按照一定的格式进 ...
- 机器学习(四) 分类算法--K近邻算法 KNN (上)
一.K近邻算法基础 KNN------- K近邻算法--------K-Nearest Neighbors 思想极度简单 应用数学知识少 (近乎为零) 效果好(缺点?) 可以解释机器学习算法使用过程中 ...
- 机器学习(四) 机器学习(四) 分类算法--K近邻算法 KNN (下)
六.网格搜索与 K 邻近算法中更多的超参数 七.数据归一化 Feature Scaling 解决方案:将所有的数据映射到同一尺度 八.scikit-learn 中的 Scaler preprocess ...
- 《机器学习实战》---第二章 k近邻算法 kNN
下面的代码是在python3中运行, # -*- coding: utf-8 -*- """ Created on Tue Jul 3 17:29:27 2018 @au ...
- 机器学习 Python实践-K近邻算法
机器学习K近邻算法的实现主要是参考<机器学习实战>这本书. 一.K近邻(KNN)算法 K最近邻(k-Nearest Neighbour,KNN)分类算法,理解的思路是:如果一个样本在特征空 ...
- 机器学习(1)——K近邻算法
KNN的函数写法 import numpy as np from math import sqrt from collections import Counter def KNN_classify(k ...
- 机器学习随笔01 - k近邻算法
算法名称: k近邻算法 (kNN: k-Nearest Neighbor) 问题提出: 根据已有对象的归类数据,给新对象(事物)归类. 核心思想: 将对象分解为特征,因为对象的特征决定了事对象的分类. ...
- 机器学习实战python3 K近邻(KNN)算法实现
台大机器技法跟基石都看完了,但是没有编程一直,现在打算结合周志华的<机器学习>,撸一遍机器学习实战, 原书是python2 的,但是本人感觉python3更好用一些,所以打算用python ...
- 机器学习实战笔记(Python实现)-01-K近邻算法(KNN)
--------------------------------------------------------------------------------------- 本系列文章为<机器 ...
- 02机器学习实战之K近邻算法
第2章 k-近邻算法 KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法. 一句话总结:近朱者赤近墨者黑! k ...
随机推荐
- PostgreSQL恢复误删数据
在Oracle中:删除表或者误删表记录:有个闪回特性,不需要停机操作,可以完美找回记录.当然也有一些其他的恢复工具:例如odu工具,gdul工具.都可以找回数据.而PostgreSQL目前没有闪回特性 ...
- GreenPlum数据库安装
第一章 文档概述 本文描述适用于Greenplum4.0以上版本的安装操作.所涉及到的操作系统相关参数调整,主要针对Redhat Linux操作系统. 第二章 安装介质 操作系统:Cent ...
- scala中list集合的操作与总结
/** * Created by root * Description : List */ object ListTest { def main(args: Array[String]): Unit ...
- yarn基础架构
Yarn的基本架构 Yarn是Hadoop2.0中的资源管理系统,它的基本设计思想是将MRv1中的JobTracker拆分成两个独立的服务:一个全局的资源管理器ResourceManager和每个应用 ...
- Kafka Java consumer动态修改topic订阅
前段时间在Kafka QQ群中有人问及此事——关于Java consumer如何动态修改topic订阅的问题.仔细一想才发现这的确是个好问题,因为如果简单地在另一个线程中直接持有consumer实例然 ...
- codeforces水题100道 第九题 Codeforces Beta Round #63 (Div. 2) Young Physicist (math)
题目链接:http://www.codeforces.com/problemset/problem/69/A题意:给你n个三维空间矢量,求这n个矢量的矢量和是否为零.C++代码: #include & ...
- iOS - 扩展UIButton的响应区域
扩展UIButton的响应区域 引言 通常在iOS开发中通常会遇到产品说按钮的响应区域不大 而UI给我们的设计是按钮的面积 而不是按钮的响应面积 所以在这种情况下需要我们自己去扩展按钮的响应区域 思考 ...
- c# MVC Take的使用
Take的使用 myPicture = dbContext.MyPictures.Where(u => u.Width == request.Width && u.Height ...
- 《转》python学习(11)-表达式和语句
转自 http://www.cnblogs.com/BeginMan/p/3164600.html 一.Python语句 if语句.else语句.elif语句.条件表达式.while语句.for语句. ...
- 用图形数据库Neo4j 设计权限模块
已经 SpringSecurity 在几个项目中 实现权限模块,对于数据库,也是思考了不少,从Mysql 到 mongodb 都不是特别满意, 在Mysql中,如果权限相对简单,那么还能接受,如果稍微 ...