python的knn算法list_Python机器学习实战笔记之KNN算法

刚刚开始在一个视频上学习机器学习,不懂的还是很多,这也算作是学习机器学习的笔记吧 KNN算法,K nearest neighbor 最近的K个邻居,了解一个算法,先从了解一个问题开始,现在问题如下,有很多的数字图片,每个图片上面有一个数字,每个图片是28*28

1、k-近邻算法

测量不同特征值之间的距离方法进行分类

优 点 :精度高、对异常值不敏感、无数据输入假定。

缺点:计算复杂度高、空间复杂度高。

适用数据范围:数值型和标称型。

(常用欧氏距离)

1收集数据2准备数据3分析数据4训练算法5测试算法6使用算法

Python中识别中文

文件开头添加

#coding:utf-8

k近邻法与kd树

为了提高k近邻搜索的效率,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数。具体方法有很多,这里介绍kd树方法

参考

http://blog.csdn.net/qll125596718/article/details/8426458

Python版实现

http://blog.csdn.net/q383700092/article/details/51757762

R语言版调用函数

http://blog.csdn.net/q383700092/article/details/51759313

MapReduce简化实现版

http://blog.csdn.net/q383700092/article/details/51780865

spark版

后续添加

from numpy import * # 科学计算包

import operator # 运算符模块

from os import listdir

def createDataSet():

group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])

labels = ['A','A','B','B']

return group, labels

#KNN算法核心 inx需要分类的向量,训练样本dataSet标签向量labels 近邻的数目

#调用格式KNN.classify0([0,0], group, labels, 3)

def classify0(inX, dataSet, labels, k):

dataSetSize = dataSet.shape[0] #向量大小n

diffMat = tile(inX, (dataSetSize,1)) - dataSet #分类向量1重复n次减去训练样本

sqDiffMat = diffMat**2 #**代表幂计算 2次方

sqDistances = sqDiffMat.sum(axis=1) #计算每行的和

distances = sqDistances**0.5 #每个数开根号

sortedDistIndicies = distances.argsort() #升序排序后的数据原来位置的下标

classCount={}

for i in range(k):

voteIlabel = labels[sortedDistIndicies[i]] #將排序后的labers輸出(从多到少的标号选出3个)

classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #get(k,d)如果k不在classCount为d

#将classCount按照第二字段排序

sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)

#返回最近3个值的里最近的那个值的标签

return sortedClassCount[0][0]

#将文本记录到转换NumPy的解析程序

#datingDataMat,datingLabels=KNN.file2matrix('G:/python/pythonwork/datingTestSet2.txt')

def file2matrix(filename):

fr = open(filename)

numberOfLines = len(fr.readlines()) #get the number of lines in the file

returnMat = zeros((numberOfLines,3)) #prepare matrix to return

classLabelVector = [] #prepare labels return

fr = open(filename)

index = 0

for line in fr.readlines():

line = line.strip() #去除首尾空格

listFromLine = line.split('\t')

returnMat[index,:] = listFromLine[0:3]

classLabelVector.append(int(listFromLine[-1])) #索引值-1表示列表中的最后一列元素

index += 1

return returnMat,classLabelVector

#归一化

#normMat, ranges, minVals=KNN.autoNorm(datingDataMat)

def autoNorm(dataSet):

minVals = dataSet.min(0)

maxVals = dataSet.max(0)

ranges = maxVals - minVals

normDataSet = zeros(shape(dataSet))

m = dataSet.shape[0]

normDataSet = dataSet - tile(minVals, (m,1))

normDataSet = normDataSet/tile(ranges, (m,1)) #element wise divide

return normDataSet, ranges, minVals

#分类器结果 KNN.datingClassTest()

def datingClassTest():

hoRatio = 0.50 #hold out 10%

datingDataMat,datingLabels = file2matrix('G:/python/pythonwork/datingTestSet2.txt') #load data setfrom file

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))

print "error: %f,total: %d" % (errorCount,numTestVecs)

数字识别

问题导读(我是好文章的搬运工) 1、了解贝叶斯分类、 贝叶斯定理和朴素贝叶斯分类的概念以及历史发展,以及三者之间有何联系。 2、贝叶斯定理实现的关键是什么? 3、本文用MATLAB实现了实例来说明朴素贝叶斯算法。 4、它们在计算机中有哪些应用?这个值得思

#将图像转换为向量

def img2vector(filename):

returnVect = 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

#构建手写识别系统

def handwritingClassTest():

hwLabels = []

trainingFileList = listdir('G:/python/pythonwork/trainingDigits') #load the training set

m = len(trainingFileList)

trainingMat = zeros((m,1024))

for i in range(m):

fileNameStr = trainingFileList[i]

fileStr = fileNameStr.split('.')[0] #take off .txt

classNumStr = int(fileStr.split('_')[0])

hwLabels.append(classNumStr)

trainingMat[i,:] = img2vector('G:/python/pythonwork/trainingDigits/%s' % fileNameStr)

testFileList = listdir('G:/python/pythonwork/testDigits') #iterate through the test set

errorCount = 0.0

mTest = len(testFileList)

for i in range(mTest):

fileNameStr = testFileList[i]

fileStr = fileNameStr.split('.')[0] #take off .txt

classNumStr = int(fileStr.split('_')[0])

vectorUnderTest = img2vector('G:/python/pythonwork/testDigits/%s' % fileNameStr)

classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)

print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr)

if (classifierResult != classNumStr): errorCount += 1.0

print "\nthe total number of errors is: %d" % errorCount

print "\nthe total error rate is: %f" % (errorCount/float(mTest))

k近邻法与kd树

为了提高k近邻搜索的效率,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数。具体方法有很多,这里介绍kd树方法

参考

http://blog.csdn.net/qll125596718/article/details/8426458

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值