python算法实例
#The first machine learning algorithm--kNN ''' 导入科学计算包Numpy和运算符模块 ''' from numpy import * import operator def creatDataSet(): group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels=['A','A','B','B'] return group,labels ''' inX是用于分类的输入向量,dataSet输入的训练样本集, labels标签向量,k确定选择最近邻居的数目 ''' def classify0(inX,dataSet,labels,k): #计算距离 dataSetSize=dataSet.shape[0] #数据集的行 diffMat=tile(inX,(dataSetSize,1))-dataSet sqDiffMat=diffMat**2 sqDistance=sqDiffMat.sum(axis=1) distances=sqDistance**0.5 sortedDistanceIndicies=distances.argsort() classCount={} #选择距离最小的K个点 for i in range(k): voteIlabel=labels[sortedDistanceIndicies[i]] classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #排序 sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True) return sortedClassCount[0][0] # group,labels=creatDataSet() # classify0([0,0],group,labels,3) # print(classify0([0,0],group,labels,3)) ''' 准备数据:从文本文件中解析数据,将文本记录转为numpy的解析程序 ''' def file2matrix(filename): fr=open(filename) arrayOLines=fr.readlines() numberOfLines=len(arrayOLines) #得到文件行数 returnMat=zeros((numberOfLines,3)) #创建0矩阵,用作返回的numpy矩阵 classLabelVector=[] index=0 #解析文件数据到列表 for line in arrayOLines: line=line.strip() #去掉所有回车字符 listFromLine=line.split('\t') #使用tab字符将上一步得到的整行数据分割为一个元素列表 returnMat[index,:]=listFromLine[0:3] #选取前三个元素,存到特征矩阵中 classLabelVector.append(int(listFromLine[-1])) #-1代表最后一列元素 index+=1 return returnMat,classLabelVector datingDataMat,datingLabels=file2matrix('datingTestSet.txt') ''' 分析数据:使用matplotlib创建散点图 ''' import matplotlib import matplotlib.pyplot as plt fig=plt.figure() ax=fig.add_subplot(111) ax.scatter(datingDataMat[:,1],datingDataMat[:,2], 15.0*array(datingLabels),15.0*array(datingLabels)) #使用datingDataMat矩阵第二列和第三列的数据 plt.show ''' 准备数据:归一化数据,将数据的取值范围处理为0到1或者-1到1 autoNorm()函数可以自动将数字特征值转化为0到1的区间 tile(x,(2))函数将x将函数沿着X轴扩大两倍,tile(x,(1,2))将x向Y轴扩大1倍,向X轴扩大2倍 ''' def autoNorm(dataSet): minVals=dataSet.min(0) #使得函数可以从列中选取最小值,列!!! maxVals=dataSet.max(0) #最大特征值 ranges=maxVals-minVals normDataSet=zeros(shape(dataSet)) m=dataSet.shape[0] #1000,和前面特征矩阵的行数相同 normDataSet=dataSet-tile(minVals,(m,1)) #统一特征矩阵1000x3和minVals、range(1x3)的大小 normDataSet=normDataSet/tile(ranges,(m,1)) #特征值相除 return normDataSet,ranges,minVals normMat,ranges,minVals=autoNorm(datingDataMat) ''' 测试算法:作为完整程序验证分类器 ''' def datingClassTest(): hoRatio=0.1 datingDataMat,datingLabels=file2matrix('datingTestSet.txt') normMat,ranges,minVals=autoNorm(datingDataMat) m=normMat.shape[0] numTestVecs=int(m*hoRatio) errorCount=0.0 for i in range(numTestVecs): classifierResult=classify0(normMat[i,:],normMat[numTestVecs:m,:], datingLabels[numTestVecs:m],3) print("the classifier came back with: %d, the real answer is: %d" \ % (classifierResult,datingLabels[i])) if (classifierResult !=datingLabels[i]): errorCount+=1.0 print("the total error rate is %f" %(errorCount/float(numTestVecs)))