ML in action代码学习/CH02 KNN/约会网站配对效果改进
来源:互联网 发布:php短信接口怎么写 编辑:程序博客网 时间:2024/06/03 17:09
from numpy import *import operator
分类
def classify0(inX,dataSet,labels,k): #用于分类的是inX,用于训练的是dataSet dataSetSize = dataSet.shape[0] # 获取dataSet矩阵的行数 diffMat =tile(inX,(dataSetSize,1))-dataSet #将行向量inX复制dataSetSize行,求inX与每一个实例之间的距离 sqDiffMat = diffMat**2 #对距离求平方 sqDistance = sqDiffMat.sum(axis=1) # 距离平方和 axis=0列相加 =1行相加 distances = sqDistance**0.5 #开根号 sortedDistIndicies = distances.argsort() #取距离的索引(从小到大) classCount ={} #生成一个用于存放label及其对应次数的字典 for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] #取前k个距离对应的label classCount[voteIlabel] =classCount.get(voteIlabel,0)+1 #取label对应的次数,加1。没有时默认取0加1 sortedClassCount =sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) #这里的知识点有: #dict.iteritems() 返回迭代器,占内存少,但是访问慢 ps:dict.item()返回列表,占内存多,访问快 #operator.itemgetter(item) 返回一个可调用的对象,取操作对象的items #eg:f = itemgetter(2), call f(r) returns r[2] #sorted(iterable[, cmp[, key[, reverse]]]) # iterable 是进行排序的list或者iterator # cmp 是进行比较的函数 # key是取待排序元素的哪一项进行排序 # reverse默认为false升序,true为降序 # https://docs.python.org/2/library/functions.html?highlight=sorted#sorted return sortedClassCount[0][0]
数据预处理
def file2matrix(filename): fhand = open(filename) arrayOfLines = fhand.readlines() # read() 一次性读取成一个字符串,换行显示表示成\n # readlines() 一次性读取,按行解析成列表 # readline() 一次读取一行,没有足够内存一次性读取使用 numOfLines = len(arrayOfLines) returnMat = zeros((numOfLines,3)) # numpy.zeros(shape, dtype=float, order='C') 返回一个新的array ,可以是list,也可以是mmatrix classLabelVector = [] index = 0 for line in arrayOfLines: line = line.strip() listFromLine = line.split("\t") # 有4个元素,前三个是特征,最后一个是target returnMat[index,:] = listFromLine[0:3] classLabelVector.append(int(listFromLine[-1])) #用int的原因是元素存储为整形,否则会被python认为是字符串 index += 1 return returnMat,classLabelVector
reload(knn)datingDataMat,datingLabels = knn.file2matrix("datingTestSet2.txt")
import matplotlib import matplotlib.pyplot as pltfig = plt.figure() #新建一个Figure画布对象ax = fig.add_subplot(111) #将整个画布分成1行1列,在第一个块区域里面生成Axes对象ax.scatter(xDataSet,yDataSet)#matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)plt.show()
数据归一化
newValue = (oldValue - minValue)/(max-min)
def autoNorm(dataSet): minVals = dataSet.min(0) #取每列的最小值,参数为1取行 maxVals = dataSet.max(0) #取每列的最大值 ranges = maxVals - minVals # 区间距离,分母 normDataSet =zeros(shape(dataSet)) #新建一个同dataSet行列的0阵来存放归一化后的矩阵 m = dataSet.shape[0] #取行数 normDataSet = dataSet - tile(minVals,(m,1)) #分子biao'shi'ju'ti'de'zhi'xiang normDataSet = normDataSet /tile(ranges,(m,1)) #想起来matlab里面./和/的差别。在numpy中,matrix/matrix只表示 return normDataSet,ranges,minVals
reload(knn)normMat,ranges,minVals = knn.autoNorm(datingDataMat)
测试
def datingClassTest(): hoRatio = 0.10 datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') normMat,ranges,minVals = autoNorm(datingDataMat) m=normMat.shape[0] # 行数,即样例总数 numTestVecs = int(m*hoRatio) #样例的10%作为测试样例 errorCount=0.0 for i in range(numTestVecs): classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs,:],3) #测试数据需要随机选择,而数据本身并没有特定的排序,所以可以直接选择前面的10%行来作为测试数据,后面的作为训练集 print "the classifier came back with:%d,the real answer is %d" % (classifierResult,datingLabels[i]) #print 输入带精度数字的用法 print "%d/f" %(variable) %r是万能符 if(classifierResult!=datingLabels[i]):errorCount +=1.0 print "the total error rate is %f" % (errorCount/float(numTestVecs))
预测函数
def classifyPerson(): resultList = ["not at all","in small doses","in large doses"] #结果列表 percenrTats=float(raw_input("percentage of time spent playing video games?")) #输入参数1 ffMiles = float(raw_input("frequent flier miles earned per year")) #输入参数2 iceCream = float(raw_input("liters of ice cream consumed per year")) #输入参数3 datingDataMat,datingLabels = file2matrix("datingTestSet2.txt") #获取训练集,标签 normMat,ranges,minVals = autoNorm(datingDataMat) # 归一化 inArr =array([ffMiles,percenrTats,iceCream]) # 输入参数向量化 classifierResult = classify0((inArr-minVals)/ranges,normMat,datingLabels,3) #分类 print "you will probably like this person:",resultList[classifierResult-1] #输出结果
阅读全文
0 0
- ML in action代码学习/CH02 KNN/约会网站配对效果改进
- Machine Learning in Action_CH2_2_使用kNN改进约会网站的配对效果
- kNN算法改进约会网站的配对效果
- 使用KNN算法改进约会网站的配对效果
- 机器学习实战笔记——利用KNN算法改进约会网站的配对效果
- 机器学习实战—k近邻算法(kNN)02-改进约会网站的配对效果
- <机器学习实战 >KNN算法 改进约会网站的配对效果
- 机器学习实战(①)——KNN算法改进约会网站的配对效果和手写字识别系统
- 读懂《机器学习实战》代码—K-近邻算法改进约会网站配对效果
- 机器学习实战k-近邻算法(kNN)应用之改进婚恋网站配对效果代码解
- k-近邻算法(KNN)--2改进约会网站的配对效果---by香蕉麦乐迪
- 机器学习-kNN算法改进约会效果
- 基于KNN算法的约会网站配对效果 python3.2
- 基于KNN算法的约会网站配对效果 python3.2
- kNN近邻算法改善约会网站配对效果案例
- KNN实战——约会网站配对效果判定
- 机器学习 & python 使用k-近邻算法改进约会网站的配对效果
- 学习笔记:使用k-近邻算法改进约会网站的配对效果
- Android Recycler View解决item宽度无法填充屏幕(没有父容器参数也行)
- Java调用微信支付接口完整版
- Xshell linux 常用命令
- BeautifulSoup
- scikit-learn Adaboost类库使用小结
- ML in action代码学习/CH02 KNN/约会网站配对效果改进
- hbase 表重命名
- Bentley AutoPIPE
- Android 设置状态栏颜色&&沉浸式状态栏
- 数据结构——第六讲、图(上)(2)
- request.getParameter() 和request.getAttribute() 区别
- Redis与数据库数据同步解决方案
- jq学习笔记1
- YII2 更改入口文件