关键词:
程序主体:
- 以kNN算法为基础
- 增加了文件数据导入函数
- 增加了可视化操作
- 增加了算法错误率判定
1 # -*- coding:utf-8 -*- 2 from numpy import * 3 import operator 4 import math 5 import matplotlib 6 import matplotlib.pyplot as plt 7 import numpy as np 8 import random 9 import collections 10 11 def classify0(inX,dataSet,labels,k): 12 dataSetSize = dataSet.shape[0] 13 diffMat = tile(inX,(dataSetSize,1)) - dataSet 14 sqDiffMat = diffMat**2 15 print sqDiffMat 16 sqDistances = sqDiffMat.sum(axis = 1) 17 distances = sqDistances.argsort() 18 # sortedDistIndicies = distances.argsort() 19 classCount=collections.OrderedDict() 20 for i in range(k): 21 voteIlabel = labels[distances[i]] 22 classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 23 print classCount 24 sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse = True) 25 print sortedClassCount 26 return sortedClassCount[0][0] 27 28 def file2matrix(filename): 29 fr = open(filename) 30 arrayOLines = fr.readlines() 31 numberOfLines = len(arrayOLines) 32 returnMat = zeros((numberOfLines,3)) 33 classLabelVector = [] 34 index = 0 35 for line in arrayOLines: 36 line = line.strip() 37 listFromLine = line.split(‘ ‘) 38 returnMat[index,:] = listFromLine[0:3] 39 classLabelVector.append(int(listFromLine[0])) 40 index+=1 41 return returnMat,classLabelVector 42 43 def autoNorm(dataSet): 44 minVals = dataSet.min(0) 45 maxVals = dataSet.max(0) 46 ranges = maxVals - minVals 47 normDataSet = zeros(shape(dataSet)) 48 m = dataSet.shape[0] 49 normDataSet = dataSet - tile(minVals,(m,1)) 50 normDataSet = normDataSet/tile(ranges,(m,1)) 51 return normDataSet,ranges,minVals 52 53 datingdataMat,datingLabels = file2matrix(‘/Users/tiemuer/PycharmProjects/kNN/data.txt‘) 54 fig = plt.figure() 55 ax = fig.add_subplot(111) 56 ax.scatter(datingdataMat[:,0],datingdataMat[:,1],15.0*array(datingLabels),15.0*array(datingLabels)) 57 plt.show() 58 59 def datingClassTest(): 60 hoRatio = 0.10 61 datingdataMat,datingLabels = file2matrix(‘/Users/tiemuer/PycharmProjects/kNN/data.txt‘) 62 normMat,ranges,minVals = autoNorm(datingdataMat) 63 m = normMat.shape[0] 64 numTestVecs = int(m*hoRatio) 65 errorCount = 0.0 66 n = [] 67 for i in range(numTestVecs): 68 n.append(int(random.randint(0,m))) 69 for i in n: 70 classifierResult = classify0(normMat[i,:],normMat[:m,:],datingLabels[:m],3) 71 print "the classifier cameback with %d,the real answer is:%d"%(classifierResult,datingLabels[i]) 72 if(classifierResult!=datingLabels[i]):errorCount+=1.0 73 print "the total error rate is %f"%(errorCount/float(numTestVecs)) 74 75 76 datingClassTest()
算法改进
- 由于需要不同,书籍上的代码并不能很好契合程序,故作出一些改进。
- 文件数据导入函数中classLabelVector.append(int(listFromLine[0])),其中把listFromLine[-1]变为[0],因为本程序用每组数据第一个位置来做label,这样才能与后面寻找label契合。
- 本程序选取数据集中随机10%的数据来与原数据集进行匹配,因为数据集不够,且数据集完全随机生成,进而发现问题:对于小数据来说很难做到错误率低。主要原因在于对于相近邻的数据统计次数过少,且普通字典是无序排放,导致不能选出最契合的label,本人针对此问题选用有序字典进行label存储,可以进一步改善算法准确率。
- 上一篇文章的kNN算法需要改动,删掉本程序中注释掉的代码(多进行了一次排序导致程序混乱,得不到期望结果)。
- 由于各个数据项特征值大小不同,而它们在程序中的地位同等,故用autoNorm()函数来调整大小:(data-mindata)/(maxdata-mindata)把特征值统一到0-1之间,更具参考性。
初学python,记录学习笔记
- 字典访问需要key,而key的获取可以用dic.keys()来得到一个list
- 对字典进行排序时,利用迭代器方法sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse = True),reverse = True 进行升序排序,返回的不是字典,而可以通过下标访问
- open(filename)打开文件,读文件用readlines(),下面记录下read(),readline(),readlines()函数的区别:
- read():读取整个文件,文件内容存放于字符串变量中
- readline():读取文件一行,存放于字符串对象中,比readlines()慢许多
- readlines():读取整个文件,自动把文件分成一个行的列表
- 普通字典是无序的,故不能利用存放次序来寻找字典元素,可以借助collections库中的collections.OrderedDict()来创建一个有序字典。
-
strip() 方法用于移除字符串头尾指定的字符(默认为空格)。例如:str.strip([chars])
-
split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串。例如:split(‘ ‘,1)仅对于空格分割一次。
- 这里不整理可视化作图操作,回头找个时间专门做个整理。
机器学习常见性能指标《机器学习实战》笔记
均方根误差平均绝对误差 查看详情
《机器学习实战》读书笔记2:k-近邻(knn)算法
声明:文章是读书笔记,所以必然有大部分内容出自《机器学习实战》。外加个人的理解,另外修改了部分代码,并添加了注释1、什么是K-近邻算法?简单地说,k-近邻算法采用测量不同特征值之间距离的方法进行分类。不恰当... 查看详情
机器学习实战笔记-利用adaboost元算法提高分类性能
...大家可能都会考虑吸取多个专家而不只是一个人的意见。机器学习处理问题时又何尝不是如此?这就是元算法(meta-algorithm)背后的思路。元算法是对其他算法进行组合的一种方式7.1基于数据集多重抽样的分类器??我们自然可以将... 查看详情
《机器学习实战》知识点笔记目录
从今天起,开始学习《机器学习实战》,并记录学习到的知识点。 --2017-12-311,第2章KNN算法笔记_函数classify0 查看详情
机器学习实战笔记-1基础
机器学习基础什么是机器学习机器学习能让我们从数据集中受到启示。换句话说。我们会利用计算机来彰显数据背后的真实含义。简单的说机器学习就是把无序数据转换成实用的信息。关键术语特征(属性):对一类物体我们关心... 查看详情
《机器学习实战》学习笔记——k近邻算法
1.numpy中一些函数的用法学习shape()用法:shape :tupleofintsTheelementsoftheshapetuplegivethelengthsofthecorrespondingarraydimensions.。 shape返回一个元组,依次为各维度的长度。shape[0]:第一维长度,shape[1]:第二维长度。 tile()用法:numpy.tile 查看详情
机器学习实战笔记logistic回归
参考链接http://blog.csdn.net/lu597203933/article/details/38468303Logistic代码#Logistic回归分类使用梯度上升找最佳参数importnumpyasnpdefloadDataSet():datMat=[];labelMat=[]fr=open(‘testSet.txt‘)forlineinfr.readlines():lineAr 查看详情
机器学习实战笔记--决策树
tree.py代码1#encoding:utf-82frommathimportlog3importoperator4importtreePlotterastp567defcreateDataSet():#简单测试数据创建8dataSet=[[1,1,‘yes‘],9[1,1,‘yes‘],10[1,0,‘no‘],11[0,1,‘no‘],12[0,1,‘no‘]]13labels=[‘nosu 查看详情
机器学习实战笔记--朴素贝叶斯
1#encoding:utf-82fromnumpyimport*3importfeedparser45#加载数据集6defloadDataSet():7postingList=[[‘my‘,‘dog‘,‘has‘,‘flea‘,‘problems‘,‘help‘,‘please‘],8[‘maybe‘,‘not‘,‘take‘,‘him‘,‘to‘,‘dog‘,‘park‘,‘stupid‘], 查看详情
机器学习实战笔记--k近邻算法
1#encoding:utf-82fromnumpyimport*3importoperator4importmatplotlib5importmatplotlib.pyplotasplt67fromosimportlistdir89defmakePhoto(returnMat,classLabelVector):#创建散点图10fig=plt.figure()11ax=fig.add_subpl 查看详情
学习打卡07可解释机器学习笔记之shape+lime代码实战(代码片段)
可解释机器学习笔记之Shape+Lime代码实战文章目录可解释机器学习笔记之Shape+Lime代码实战基于Shapley值的可解释性分析使用Pytorch对MNIST分类可解释性分析使用shap的DeepExplainer进行可视化使用Pytorch对预训练ImageNet图像分类可解... 查看详情
学习打卡07可解释机器学习笔记之shape+lime代码实战(代码片段)
可解释机器学习笔记之Shape+Lime代码实战文章目录可解释机器学习笔记之Shape+Lime代码实战基于Shapley值的可解释性分析使用Pytorch对MNIST分类可解释性分析使用shap的DeepExplainer进行可视化使用Pytorch对预训练ImageNet图像分类可解... 查看详情
学习打卡05可解释机器学习笔记之cam+captum代码实战(代码片段)
可解释机器学习笔记之CAM+Captum代码实战文章目录可解释机器学习笔记之CAM+Captum代码实战代码实战介绍torch-cam工具包可视化CAM类激活热力图预训练ImageNet-1000图像分类-单张图像视频以及摄像头预测pytorch-grad-cam工具包Grad-CAM热... 查看详情
《机器学习实战》笔记——逻辑回归
书上没有给具体的逻辑回归的课程,就直接上了代码,这很不好!可以参考ng的课程,或者看这篇博文:http://blog.csdn.net/wlmnzf/article/details/72855610?utm_source=itdadao过程还是比较浅显易懂的,就没怎么备注了。1#_*_coding:utf-8_*_23fromnumpyi... 查看详情
机器学习实战笔记-决策树
图3-1所示的流程图就是一个决策树,正方形代表判断模块(decisionblock),椭圆形代表终止模块(terminatingblock),表示已经得出结论,可以终止运行。从判断模块引出的左右箭头称作分支(branch),它可以到达另一个判断模块或者终止模... 查看详情
《机器学习实战》笔记——朴素贝叶斯
运用贝叶斯公式(朴素贝叶斯假设每个特征每个特征都是独立的)可以解决的问题有,已知某些特征,用来判断某情况发生的可能性大小,设置可能性最大的情况作为预测值。是一种监督算法。广泛应用于垃圾邮件检测等等。1#_... 查看详情
机器学习实战读书笔记——端到端的机器学习项目(代码片段)
驱动任务:根据加州住房价格的数据集建立加州的房价模型数据集下载地址:https://pan.baidu.com/s/1it08eJ7a1ZGTTc7mHBZVzw?pwd=9n132.2设计系统典型的有监督学习任务,已经给出了标记的训练示例(每个实例都有预期的产... 查看详情
机器学习实战笔记-预测数值型数据:回归
8.1用线性回归找到最佳拟合直线线性回归 优点:结果易于理解,计算上不复杂。 缺点:对非线性的数据拟合不好。 适用数据类型:数值型和标称型数据。回归的目的是预测数值型的目标值。最直接的办法是依据输人... 查看详情