机器学习实践笔记(一)KNN
主要是参考机器学习实践(作者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.拿到数据咱们开始分析 2.Arima 硬性基础知识 Arima模型 AR MA ARMA ARIMA 如何选择p值和q值 自相关函数ACF 建立Arima模型 数据的确定 模型预测 ...
- 机器学习实践笔记(二)EOF
1.简单介绍: EOF是一种分析矩阵数据中的结构特征,提取主要数据特征量的一种方法.EOF又名PCA.(嘿嘿先这么想,其实在python里就一个函数鸭,PCA可以额外写一篇进行解释,这里只写一下应用啦 ...
- Ch2,KNN分类算法程序分析----机器学习实践P19页
此文是对机器学习实践P19页的代码分析 1,建立一个group组,每行有两个特征(或称属性),建立一个标签labels,存放组对于的目标变量. from numpy import * import o ...
- 机器学习系列笔记一:Introduction
机器学习系列笔记一:Intro 文章目录 机器学习系列笔记一:Intro 数据 基本任务 1. 分类 2. 回归 机器学习的工作流程 机器学习算法的传统分类 监督学习 无监督学习 半监督学习 增强/强 ...
- 机器学习系列笔记十三: 集成学习/模型聚合
机器学习系列笔记十三: 集成学习/模型聚合 文章目录 机器学习系列笔记十三: 集成学习/模型聚合 什么是集成学习 Voting Hard Voting 模拟实现Hard Voting 集成学习 使用V ...
- 哈工大机器学习复习笔记(一)
本篇文章是在参考西瓜书.PPT课件.网络上相关博客等资料的基础上整理出的机器学习复习笔记,希望能给大家的机器学习复习提供帮助.这篇笔记只是复习的一个参考,大家一定要结合书本.PPT来进行复习,有些公式 ...
- 十年公务员转行IT,自学AI三年,他淬炼出746页机器学习入门笔记
整理 | Jane 编辑 | Just 出品 | AI科技大本营(ID:rgznai100) 近期,梁劲传来该笔记重大更新的消息.<机器学习--从入门到放弃>这本笔记的更新没有停止,在基于 ...
- 为什么要写《机器学习实践应用》这本书
预售地址: https://item.jd.com/12114501.html 历经了10个月,<机器学习实践应用>这本书终于面世了.首先呢,因为我的工作比较忙,只能抽一些周末或者是下班以 ...
- (视频+图文)机器学习入门系列-第5章 机器学习实践
机器学习入门系列,黄海广老师主讲.本站将持续更新,ppt.代码.课后习题见文末. 本系列的目录 01.引言 02.回归 03.逻辑回归 04.朴素贝叶斯 05.机器学习实践 06.机器学习库Sciki ...
最新文章
- js 获取元素的几种方法
- 博客园里有多少人对企业信息化感兴趣
- 初学jQuery之jQuery虚假购物车-------与真实数据无关
- 面试题:SSH 和 SSM 两个框架的浅显的区别?
- css html 属性区别是什么,css常见属性
- windows下consul安装启动
- python对数组排序代码实现_Python自定义类的数组排序实现代码
- 1971年中国的预警机就上天了
- svc补偿时matlab仿真设计,TCR+FC型SVC的研究及MATLAB仿真
- 搜狗新闻文本分类竞赛
- 《少有人走的路:心智成熟的旅程》读书摘要
- ubuntu安装搜狗拼音输入法
- hau 1870 愚人节的礼物(栈)
- 提升用户体验?指示性设计元素不可或缺
- [STL源码剖析]空间置配器allocator
- 东周列国志美文摘录-晏平仲巧辩服荆蛮
- 进制转换算法(通用,极简)
- 图像处理学习2,边缘检测1(sobel算子,kirsch算子)
- html中两列合并,表格怎么把两列内容合并到一起
- java 拉姆达 lamdba get
热门文章
- [转]Windows关机过程分析与快速关机
- Leetcode 133.克隆图
- 关于信道利用率的总结与一道习题的最终解释
- EfficientNet论文翻译
- VSCode Python解决 No module named 问题
- 从王者荣耀看设计模式(二.单例模式)
- 深入理解JVM-类加载器深入解析(3)
- 日常开发中的几个常用跨域处理方式
- Delphi 与 DirectX 之 DelphiX(60): TDIB.DoTrace();
- gsm短信猫长短信pdu数据包分析[转]