学习日志---knn算法实现
KNN算法实现:
提取文本:
importnumpyasnp//提取文本defloadDataSet(fileName):numFeat=len(open(fileName).readline().split(','))dataMat=[];labelMat=[]fr=open(fileName)forlineinfr.readlines():lineArr=[]line=line.strip()curline=line.split(',')foriinrange(0,numFeat-1):lineArr.append(float(curline[i]))dataMat.append(lineArr)labelMat.append(float(curline[-1]))xMat=np.mat(dataMat)returnxMat,labelMat//训练样本标准化defautoNorm(dataSet):minVals=dataSet.min(0)maxVals=dataSet.max(0)range=maxVals-minValsnormDataSet=np.zeros(np.shape(dataSet))m=dataSet.shape[0]normDataSet=dataSet-np.tile(minVals,(m,1))normDataSet=normDataSet/np.tile(range,(m,1))returnnormDataSet//讲总样本分为训练样本和检测样本defclassifyDataSet(normDataSet,labelMat):labDataSet=np.array(normDataSet.copy())testDataSet=[]testResultSet=[]classfiDataSet=[]classfiResultSet=[]size=labDataSet.shape[0]forjinrange(size):if(j%50==0):testDataSet.append(labDataSet[j])testResultSet.append(labelMat[j])else:classfiDataSet.append(labDataSet[j])classfiResultSet.append(labelMat[j])returnclassfiDataSet,classfiResultSet,testDataSet,testResultSet
KNN
这里进入的是两个数组,不是矩阵
importnumpyasnpimportoperatorasopdefclassify(inX,dataSet,labels,k=7):dataSetSize=dataSet.shape[0]diffMat=np.tile(inX,(dataSetSize,1))-dataSetsqDiffMat=diffMat**2sqlDistances=sqDiffMat.sum(axis=1)distances=sqlDistances**0.5sortedDistIndices=distances.argsort()classCount={}foriinrange(k):voteLabel=labels[sortedDistIndices[i]]classCount[voteLabel]=classCount.get(voteLabel,0)+1sortedResult=sorted(classCount.iteritems(),key=op.itemgetter(1),reverse=True)returnsortedResult[0][0]
main函数
importKNNimportfileOpimportnumpyasnpimportmatplotlibimportmatplotlib.pyplotaspltfig=plt.figure()ax=fig.add_subplot(111)dataMat,labelsMat=fileOp.loadDataSet('donate.txt')normDataSet=fileOp.autoNorm(dataMat)result=[]classfiDataSet,classfiResultSet,testDataSet,testResultSet=fileOp.classifyDataSet(normDataSet,labelsMat)testDataSet=np.array(testDataSet)classfiDataSet=np.array(classfiDataSet)foriinrange(testDataSet.shape[0]):result.append(KNN.classify(testDataSet[i,:],classfiDataSet,classfiResultSet,5))printresultprinttestResultSetax.scatter(normDataSet[:,2],normDataSet[:,3],15.0*(np.array(labelsMat)+1),15.0*(np.array(labelsMat)+1))plt.show()
注意:
序列可以增加或减小,无shape操作
数组有shape,转置等操作,是基于某个轴进行操作的。数组有切片功能,一般用数据操作即可,矩阵用于运算。
np.dot(arr.T,arr)可以用于计算内积
numpy
array和matrix之间的区别:参考http://www.aichengxu.com/view/12902
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。