书籍:《机器学习实战》中文版
IDE:PyCharm Edu 4.02
环境:Adaconda3  python3.6

本系列主要是代码学习记录,其中设计的理论知识,不做过多解释。书中代码使用的是python2,所以代码会有些许变化,并对其中部分函数进行注解。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
from numpy import *
import operator
from os import listdir
# 例子一:KNN算法
def createDataSet():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 = createDataSet()
def classify0(inX,dataSet,labels,k):# 计算inX与训练集之间的距离,并排序dataSetSize = dataSet.shape[0]  #行数diffMat = tile(inX,(dataSetSize,1))-dataSetsqDiffMat = diffMat**2sqDistance = sqDiffMat.sum(axis=1)distances = sqDistance**0.5sortedDistIndicies = distances.argsort()  #返回索引值classCount = {}#对前K个的标签进行统计for i in range(k):votelLabel = labels[sortedDistIndicies[i]]classCount[votelLabel] = classCount.get(votelLabel,0)+1# 对统计的标签数量进行降序排序sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)#print(sortedClassCount)return sortedClassCount[0][0]
# test = classify0([0,0],group,labels,3)
# print(test)
#例子二:约会数据
# 定义文本读取并转换为矩阵格式的函数
def file2matrix(filename):# 得到文件行数,构造矩阵fr = open(filename)arrayLines = fr.readlines()numberOfLines = len(arrayLines)returnMat = zeros((numberOfLines,3))labelVector = []index = 0for line in arrayLines:line = line.strip()   #去掉每行头尾空白# print(line)listFromLine = line.split('\t')  #获取列表元素returnMat[index,:] = listFromLine[0:3]labelVector.append(int(listFromLine[-1]))index += 1return returnMat,labelVector
#可视化数据
# data,label = file2matrix('datingTestSet2.txt')
# fig = plt.figure()
# ax = fig.add_subplot(111)
# ax.scatter(data[:,0],data[:,1],c=label)
# plt.show()
# 数据归一化
def autoNorm(dataSet):minVals = dataSet.min(0)   #参数0表示求每列的最小值;maxVals = dataSet.max(0)ranges = maxVals-minValsnormDataSet = zeros(shape(dataSet))m = dataSet.shape[0]normDataSet = dataSet-tile(minVals,(m,1))normDataSet = normDataSet/tile(ranges,(m,1))return normDataSet,ranges,minVals
# 分类器评估
def datingClassTest():ratio = 0.1datingData,datingLabels = file2matrix('datingTestSet2.txt')normMat,ranges,minVals = autoNorm(datingData)m = normMat.shape[0]numTest = int(m*ratio)errorCount = 0.0for i in range(numTest):result = classify0(normMat[i,:],normMat[numTest:m,:],datingLabels[numTest:m],3)print("the classifier's result: %d,the real answer: %d"\% (result,datingLabels[i]))if (result!=datingLabels[i]):errorCount += 1.0print("the total error rate is : %f" % (errorCount/float(numTest)))
#print(datingClassTest())
# 用户使用程序段
def classifyPerson():resultList = ['not at all','in small doses','in large doses']percentTats = float(input("玩游戏和看视频花费的时间比率?"))ffMiles = float(input("飞行里程数?"))iceCream = float(input("每周消费的冰淇淋公升数?"))datingData,datingLabels = file2matrix('datingTestSet2.txt')normMat,ranges,minVals = autoNorm(datingData)inArr = array([ffMiles,percentTats,iceCream])classierResult = classify0((inArr-minVals)/ranges,normMat,datingLabels,3)print("You will probably like this person:",resultList[classierResult-1])
#print(classifyPerson())
# 例子三:手写识别系统
def img2vector(filename):returnVect = zeros((1,1024))fr = open(filename)for i in range(32):lineStr = fr.readline()for j in range(32):returnVect[0,32*i+j] = int(lineStr[j])return returnVect
test = img2vector('trainingDigits/0_13.txt')
def handwritingClassTest():hwLabels = []# 获取目录内容trainFileList = listdir('trainingDigits')    #获取目录m = len(trainFileList)trainMat = zeros((m,1024))#从文件名中解析分类数字for i in range(m):fileNameStr = trainFileList[i]fileStr = fileNameStr.split('.')[0]classNumStr = int(fileStr.split('_')[0])hwLabels.append(classNumStr)trainMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr)testFileList = listdir('testDigits')errorCount = 0.0mTst = len(testFileList)for i in range(mTst):fileNameStr = testFileList[i]fileStr = fileNameStr.split('.')[0]classNumStr = int(fileStr.split('_')[0])vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)classierResult = classify0(vectorUnderTest,trainMat,hwLabels,3)print("分类器结果:%s,实际结果:%s" % (classierResult,classNumStr))if (classierResult!=classNumStr):errorCount +=1.0print("错误总数:%d" % errorCount)print("错误率:%f" % (errorCount/float(mTst)))
print(handwritingClassTest())

部分函数注释:
1、二维矩阵函数参数:0代表按列操作;1代表按行操作。
2、numpy shape[0]:矩阵第一维度的长度。
3、numpy tile(A,reps):根据reps设定的形式,进行重复。比如tile(A,(4,1)) ,结果是4行1列的,其中每一个元素都是A。
4、numpy sum(axis=1):可以设置参数axis。0表示按列相加,1表示按行相加。
5、numpy argsort():排序,返回数组值从小到大的索引值。
6、字典对象的get(key,default=None):返回指定键的值,若给键不存在则返回默认值。
7、内置函数 sorted():
sort 与 sorted 区别:
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
sorted(iterable[, cmp[, key[, reverse]]])
参数说明:
iterable -- 可迭代对象。
cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。key接受一个函数。
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
operator.itemgetter(1):operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。
                        用于指定获取对象的哪些维的数据。这里指对字典中的value进行排序。

8、readlines():一次读取全部文本,按行返回,结果为一个列表。
                          一般用for...in..语句获取每一行内容,且常进行操作
                         line = line.strip()   #去掉每行头尾空白
                         listFromLine = line.split('\t')  #获取列表元素
9、matplotlib.pyplot scatter():                                         
具体见 http://blog.csdn.net/anneqiqi/article/details/64125186
scatter(x,y,s=,c=):
x,y相同长度的数组数据;
s 标量或数组,可选,默认20,散点图每个点的大小
c 色彩序列,可选。

10、numpy min():
import numpy as np  
a = np.array([[1,5,3],[4,2,6]])  
print(a.min()) #无参,所有中的最小值  
print(a.min(0)) # axis=0; 每列的最小值  
print(a.min(1)) # axis=1;每行的最小值

11、细节问题
for...in.. 中:不用忘记列表生成方法range()
numpy数组对象 array()
图片显示:plt.show()

机器学习实战——KNN及部分函数注解相关推荐

  1. 机器学习实战-KNN算法-20

    机器学习实战-KNN算法-鸢尾花分类 # 导入算法包以及数据集 from sklearn import neighbors from sklearn import datasets from skle ...

  2. 机器学习实战——KNN

    一.简介 参考:https://blog.csdn.net/c406495762/article/details/75172850 环境:win 10, notebook,python 3.6 原bl ...

  3. 机器学习实战——KNN算法预测电影类型

    预测电影类型 现有爱情片和动作片(不是爱情动作片,雾)的打斗场面和接吻场面的次数统计,然后给出一个电影打斗场面和接吻场面出现的次数,预测其类型. 那么如何预测呢?当然用KNN了. KNN算法的原理就是 ...

  4. knn的python代码_《机器学习实战》之一:knn(python代码)

    数据 标称型和数值型 算法 归一化处理:防止数值较大的特征对距离产生较大影响 计算欧式距离:测试样本与训练集 排序:选取前k个距离,统计频数(出现次数)最多的类别 def classify0(inX, ...

  5. 机器学习实战笔记(Python实现)-02-k近邻算法(kNN)

    k近邻算法(kNN) 本博客来源于CSDN:http://blog.csdn.net/niuwei22007/article/details/49703719 本博客源代码下载地址:CSDN免费下载. ...

  6. 《机器学习实战》chapter02 K-近邻算法(KNN)

    2.2 示例:使用K-近邻算法改进约会网站的配结果 收集数据:提供文本文件 准备数据:使用Python解析文本文件(文本转numpy矩阵.归一化数据等) 分析数据:使用Matplotlib画二维扩散图 ...

  7. 算法代码[置顶] 机器学习实战之KNN算法详解

    改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了     前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用 ...

  8. 基于kNN的手写字体识别——《机器学习实战》笔记

    看完一节<机器学习实战>,算是踏入ML的大门了吧!这里就详细讲一下一个demo:使用kNN算法实现手写字体的简单识别 kNN 先简单介绍一下kNN,就是所谓的K-近邻算法: [作用原理]: ...

  9. 机器学习实战(一)k-近邻kNN(k-Nearest Neighbor)

    目录 0. 前言 1. k-近邻算法kNN(k-Nearest Neighbor) 2. 实战案例 2.1. 简单案例 2.2. 约会网站案例 2.3. 手写识别案例 学习完机器学习实战的k-近邻算法 ...

最新文章

  1. 洛谷 [SDOI2009]晨跑
  2. 【OS】期末总结复习
  3. binaryformatter java_Java,C#使用二进制序列化、反序列化操作数据
  4. PTA8、列表偶数位置的元素操作 (10 分)
  5. 每日算法系列【LeetCode 330】按要求补齐数组
  6. DataTable对象的操作问题
  7. Mac电脑:Android Studio 连接 MUMU 网易模拟器
  8. P5057 [CQOI2006]简单题
  9. 小胜凭智,大胜靠德|北京
  10. 计算机网络 pan名词解释,计算机网络名词解释
  11. Axure RP 认识
  12. EXCEL中进行经纬度坐标排重
  13. 解决微信公众号链接被举报的问题
  14. 企业进行固定资产盘点的作用
  15. 什么是Linux ,Unix和Linux有什么区别
  16. 常用工具(一)——安卓手机app抓包burpsuite
  17. NFT/Web3/区块链项目孵化包装策划,到底该自建运营还是专业外包孵化?
  18. php 实现雪碧图制作,如何在小程序中使用雪碧图
  19. 太原理工大学c语言期末试卷及答案,太原理工大学人工智能复习题 试题 答案概要...
  20. 掀起浪潮英语_掀起制造业革命

热门文章

  1. 机器视觉:HDR技术
  2. android ble 发送指令,Android – 如何通过蓝牙低能耗(BLE)链接发送数据?
  3. feign hystrix 线程池伸缩控制
  4. 文档在线编辑组件的发展回顾与开发集成选择问题
  5. saltstack return数据实时返回收集
  6. Sonos拿1.3亿美金给员工发福利,中国厂商要拿什么拼?
  7. Ghost本地安装highlight.js使代码高亮
  8. 日志分析工具Awstats实战之Apache篇-多站点日志分析
  9. 在Linux服务器间数据相互复制
  10. XCode 4.0 iOS SDK 4.3 iPhone证书破解 完全教程