主要是参考机器学习实践(作者peter harrington)

优点:精度高,对异常值不敏感,无数据输入假定。
缺点:计算复杂度、空间复杂度高
适用数据:数值型和标称型

个人理解:数据型是连续数据,标称型离散数据。

KNN基本原理
写了一段时间了,没人看就没更新以后的。有兴趣或者没基础可以看看。
KNN的步骤

1、导入数据

import numpy as np
import operator
data =np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels =['A','A','B','B']

其中data是传统意义上的x,是二维的,labels是y。

把x画出来观察,很明显,2个A标签和2个B标签差距很大。

2、knn原理

写的应该很清楚啦!

'''
1.计算已经知道属性的数据集中的点与当前点之间的距离;
2.按照距离递增次序排序;
3.选取与当前距离最小的k个点;
4.确定前k个点所在类别的出现频率;
5.返回前k个点出现频率最高的类别作为当前点的预测分类。
'''
def Knn(inX,dataSet,labels,k):'''四个参数inX是分类的输入向量,dataSet是输入的训练样本集,标签向量是labels,k是选择的最近的邻居个数'''dataSetSize = dataSet.shape[0]'''得到样本集中样本的数量'''diffMat = np.tile(inX,(dataSetSize,1))-dataSet'''tile共有2个参数,第一个指待输入数组比如tile([1,2,3],(3,2))就会输出:[[1,2,3,1,2,3,1,2,3][1,2,3,1,2,3,1,2,3]]    第二个就是数组重复次数,第一个参数是重复次数,第二个参数是重复几个数组'''x_square = diffMat ** 2distances_square = x_square.sum(axis = 1)'''如果axis就是普通相加,axis=0如果axiss=1那么比如矩阵为[[1,2,3],[4,5,6]]经过sum(axis=1)就会变成[6,16]'''distances = distances_square ** 0.5'''很明显的欧拉距离计算'''sorted_dostances = distances.argsort()'''升序排序'''Count = {}'''收集最近的点的计数,是个字典'''for i in range(k):voteIlabel = labels[sorted_dostances[i]]Count[voteIlabel] = Count.get(voteIlabel,0) + 1'''dict.get(name,0)就是查询字典里是否有name这个值,没有就返回0''''''选择最小的k个点'''sortedCount = sorted(Count.items(),key = operator.itemgetter(1),reverse = True)'''sorted(iterable, key = None, reverse = False)  iterable是可迭代对象key是主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。reverse是排序规则,reverse = True 降序,reverse = False 升序(默认)。iteritems()是把字典改成迭代器operator.itemgetter(1)是获取对象的第1个域的值'''return sortedCount[0][0]
'''
找到最多的个数啦
'''

调用函数的代码:

a=Knn([0,0.2],data,labels,3)
plt.plot(0, 0.2 , 'o')


大家看橙色的小球确实离B类近,而咱们的程序跑完,就是离B近。

3、优化约会网站配对效果

数据集正在审核
第一步:先导入数据集分清楚训练的X和Y

import numpy as np
'''
数据集1000行主要三种特征:
每年坐飞机里程数
玩视频游戏画的时间
每周吃冰激凌数'''
def conversion_numpy(filename):fl = open(filename)arrayfl = fl.readlines()numberOfLines = len(arrayfl)#得到文件行数returnMat = np.zeros((numberOfLines,3))#这个是建一个行数为numberOfLines,列为3的0矩阵。'''np.zeros((2,3))就是[[0,0,0],[0,0,0]]'''classLabel = []index = 0for line in arrayfl:line = line.strip()#移除字符串line头尾的空格的办法listFromline = line.split('\t')#按照空格把数据分开returnMat[index,:] = listFromline[0:3]#多行数组,一行三个classLabel.append(int(listFromline[-1]))#拿到最后一个标签index+=1return returnMat,classLabel

第二步咱们画个图:

def plot(X,Y):X1 = []X2 = []X3 = []i =0for label in Y:if label == 1:X1.append(X[i].tolist())elif label ==2:X2.append(X[i].tolist())else:X3.append(X[i].tolist())i+=1X1 = np.array(X1)X2 = np.array(X2)X3 = np.array(X3)fig = plt.figure()ax = plt.axes(projection='3d')ax.scatter3D(X1[:,0],X1[:,1],X1[:,2], cmap='Blues') ax.scatter3D(X2[:,0],X2[:,1],X2[:,2], cmap='yellow') ax.scatter3D(X3[:,0],X3[:,1],X3[:,2], cmap='Green') ax.set_xlabel('chess')ax.set_ylabel('play')ax.set_zlabel('ice-cream')

配上图:
绿色的是女生喜欢的,蓝色的不喜欢的,橙色的一般的。

第三步咱们开始处理数据了,先进行数据归一化。(防止不同的特征之间的影响)

def autoNorm(X):min_data = X.min(0)max_data = X.max(0)#拿到最大和最小值,里面加0的参数是每一列的哦ranges = min_data - max_datadata = np.zeros(np.shape(X))#生成一堆0矩阵m=X.shape[0]data = (X - np.tile(min_data,(m,1)))/np.tile(ranges,(m,1))#data = (x - min)/(max - min)这样归一化的return data, ranges ,min_data

这样就把X给归一化啦:

大家可以看到X是在(-1,1)里的。
第四步咱们把之前调用函数的方法整合下,写一个测试的函数

def datingClass():X,Y = conversion_numpy(r'C:/Users/13056/Desktop/datingTestSet2.txt')X, ranges, min_data =autoNorm(X)hoRatio = 0.1#拿0.1的测试集m = X.shape[0]numTestVecs = int(m*hoRatio)errCount = 0.0for i in range(numTestVecs):Y_pre = Knn(X[i,:],X[numTestVecs:m,:],Y[numTestVecs:m],3)print("预测的值是 %d ,真实值是 %d" %(Y_pre,Y[i]))if Y_pre != Y[i] :errCount += 1print("错误率为 %d" %(errCount/float(numTestVecs)))

俺的错误率0.05,嘿嘿。
第五步写一个用户的信息进行判断女生喜不喜欢

def classifyperson():resultList = ['不喜欢','有一点喜欢','非常喜欢']percentTats = float(input("花在视频游戏上的时间百分比"))ffMiles = float(input("坐飞机的里程数"))iceCream = float(input("每周吃几升冰激凌"))#输入信息X,Y = conversion_numpy(r'C:/Users/13056/Desktop/datingTestSet2.txt')X, ranges, min_data =autoNorm(X)X_T = np.array([percentTats,ffMiles,iceCream])Y_pre = Knn((X_T-min_data)/ranges,X,Y,3)print("这个人是:",resultList[Y_pre-1])

4、手写识别系统

为了简单起见,我们只能识别数字0到9。这些数据都是有相同存储空间宽高等相同的数据啦。
第一步把图像数据转换错可用的。
数据获取

def img2vector(filename):#1.把32×32改成1×1024的数据returnVect = np.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

第二步是写一个测试代码啦:
先讲解一下这些难理解的函数,萌新可以看看,这些都是俺记不住的。

os.listdir(r'C:/Users/13056/Desktop/testDigits')  #拿到文件夹里的目录

文件夹的样子:

def handwritingClassTest():hwLabels = []trainingFileList = os.listdir(r'C:/Users/13056/Desktop/trainingDigits')#拿到文件夹的目录内容m = len(trainingFileList)trainingMat = np.zeros((m,1024))#建一个m称1024的,m是文件夹内的文件数。for i in range(m):fileName = trainingFileList[i]#拿到第i个文件的名字fileStr = fileName.split('.')[0]#把文件名按照.分开,拿前面那一部分classNumStr = int(fileStr.split('_')[0])#把fileStr按照——分开,并拿第一个部分hwLabels.append(classNumStr)#每个文件夹的名字当坐YtrainingMat[i,:] = img2vector(r'C:/Users/13056/Desktop/trainingDigits/%s' % fileName)#文件夹内部的当XtestFileList = os.listdir(r'C:/Users/13056/Desktop/testDigits')ercount = 0#记录分类错误的测试集mT = len(testFileList)#测试集长度for i in range(mT):fileName = testFileList[i]fileStr = fileName.split('.')[0]classNumStr = int(fileStr.split('_')[0])vectorUT =img2vector(r'C:/Users/13056/Desktop/testDigits/%s' % fileName)R = Knn(vectorUT, trainingMat, hwLabels, 3)print("真实分类是 %d,预测结果是 %d" % (classNumStr,R))if classNumStr != R : ercount+=1print("准确率为:",(ercount/float(mT)))

结果:
加油!

机器学习实践笔记(一)KNN相关推荐

  1. 机器学习实践笔记(三)时间序列数据预测

    时间序列模型 1.拿到数据咱们开始分析 2.Arima 硬性基础知识 Arima模型 AR MA ARMA ARIMA 如何选择p值和q值 自相关函数ACF 建立Arima模型 数据的确定 模型预测 ...

  2. 机器学习实践笔记(二)EOF

    1.简单介绍: EOF是一种分析矩阵数据中的结构特征,提取主要数据特征量的一种方法.EOF又名PCA.(嘿嘿先这么想,其实在python里就一个函数鸭,PCA可以额外写一篇进行解释,这里只写一下应用啦 ...

  3. Ch2,KNN分类算法程序分析----机器学习实践P19页

    此文是对机器学习实践P19页的代码分析 1,建立一个group组,每行有两个特征(或称属性),建立一个标签labels,存放组对于的目标变量. from numpy import * import o ...

  4. 机器学习系列笔记一:Introduction

    机器学习系列笔记一:Intro 文章目录 机器学习系列笔记一:Intro 数据 基本任务 1. 分类 2. 回归 机器学习的工作流程 机器学习算法的传统分类 监督学习 无监督学习 半监督学习 增强/强 ...

  5. 机器学习系列笔记十三: 集成学习/模型聚合

    机器学习系列笔记十三: 集成学习/模型聚合 文章目录 机器学习系列笔记十三: 集成学习/模型聚合 什么是集成学习 Voting Hard Voting 模拟实现Hard Voting 集成学习 使用V ...

  6. 哈工大机器学习复习笔记(一)

    本篇文章是在参考西瓜书.PPT课件.网络上相关博客等资料的基础上整理出的机器学习复习笔记,希望能给大家的机器学习复习提供帮助.这篇笔记只是复习的一个参考,大家一定要结合书本.PPT来进行复习,有些公式 ...

  7. 十年公务员转行IT,自学AI三年,他淬炼出746页机器学习入门笔记

    整理 | Jane 编辑 | Just 出品 | AI科技大本营(ID:rgznai100) 近期,梁劲传来该笔记重大更新的消息.<机器学习--从入门到放弃>这本笔记的更新没有停止,在基于 ...

  8. 为什么要写《机器学习实践应用》这本书

    预售地址: https://item.jd.com/12114501.html 历经了10个月,<机器学习实践应用>这本书终于面世了.首先呢,因为我的工作比较忙,只能抽一些周末或者是下班以 ...

  9. (视频+图文)机器学习入门系列-第5章 机器学习实践

    机器学习入门系列,黄海广老师主讲.本站将持续更新,ppt.代码.课后习题见文末. 本系列的目录 01.引言 02.回归 03.逻辑回归 04.朴素贝叶斯 05.机器学习实践 06.机器学习库Sciki ...

最新文章

  1. js 获取元素的几种方法
  2. 博客园里有多少人对企业信息化感兴趣
  3. 初学jQuery之jQuery虚假购物车-------与真实数据无关
  4. 面试题:SSH 和 SSM 两个框架的浅显的区别?
  5. css html 属性区别是什么,css常见属性
  6. windows下consul安装启动
  7. python对数组排序代码实现_Python自定义类的数组排序实现代码
  8. 1971年中国的预警机就上天了
  9. svc补偿时matlab仿真设计,TCR+FC型SVC的研究及MATLAB仿真
  10. 搜狗新闻文本分类竞赛
  11. 《少有人走的路:心智成熟的旅程》读书摘要
  12. ubuntu安装搜狗拼音输入法
  13. hau 1870 愚人节的礼物(栈)
  14. 提升用户体验?指示性设计元素不可或缺
  15. [STL源码剖析]空间置配器allocator
  16. 东周列国志美文摘录-晏平仲巧辩服荆蛮
  17. 进制转换算法(通用,极简)
  18. 图像处理学习2,边缘检测1(sobel算子,kirsch算子)
  19. html中两列合并,表格怎么把两列内容合并到一起
  20. java 拉姆达 lamdba get

热门文章

  1. [转]Windows关机过程分析与快速关机
  2. Leetcode 133.克隆图
  3. 关于信道利用率的总结与一道习题的最终解释
  4. EfficientNet论文翻译
  5. VSCode Python解决 No module named 问题
  6. 从王者荣耀看设计模式(二.单例模式)
  7. 深入理解JVM-类加载器深入解析(3)
  8. 日常开发中的几个常用跨域处理方式
  9. Delphi 与 DirectX 之 DelphiX(60): TDIB.DoTrace();
  10. gsm短信猫长短信pdu数据包分析[转]