温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

学习日志---knn算法实现

发布时间:2020-06-25 12:58:29 来源:网络 阅读:272 作者:wukong0716 栏目:开发技术

KNN算法实现:

提取文本:

import numpy as np

//提取文本
def loadDataSet(fileName):
    numFeat = len(open(fileName).readline().split(','))
    dataMat = []; labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr=[]
        line = line.strip()
        curline = line.split(',')
        for i in range(0,numFeat-1):
            lineArr.append(float(curline[i]))
        dataMat.append(lineArr)
        labelMat.append(float(curline[-1]))

    xMat = np.mat(dataMat)

    return xMat,labelMat

//训练样本标准化
def autoNorm(dataSet):
    minVals = dataSet.min(0)
    maxVals = dataSet.max(0)
    range = maxVals - minVals
    normDataSet = np.zeros(np.shape(dataSet))
    m = dataSet.shape[0]
    normDataSet = dataSet - np.tile(minVals,(m,1))
    normDataSet = normDataSet/np.tile(range,(m,1))
    return normDataSet

//讲总样本分为训练样本和检测样本
def classifyDataSet(normDataSet,labelMat):
    labDataSet = np.array(normDataSet.copy())
    testDataSet = []
    testResultSet = []
    classfiDataSet = []
    classfiResultSet = []
    size = labDataSet.shape[0]
    for j in range(size):
        if(j%50==0):
            testDataSet.append(labDataSet[j])
            testResultSet.append(labelMat[j])
        else:
            classfiDataSet.append(labDataSet[j])
            classfiResultSet.append(labelMat[j])
    return classfiDataSet,classfiResultSet,testDataSet,testResultSet

KNN

这里进入的是两个数组,不是矩阵

import numpy as np
import operator as op

def classify(inX, dataSet, labels,k=7):
    dataSetSize = dataSet.shape[0]
    diffMat = np.tile(inX,(dataSetSize,1))-dataSet
    sqDiffMat = diffMat**2
    sqlDistances = sqDiffMat.sum(axis=1)
    distances = sqlDistances**0.5
    sortedDistIndices = distances.argsort()
    classCount = {}
    for i in range(k):
        voteLabel = labels[sortedDistIndices[i]]
        classCount[voteLabel] = classCount.get(voteLabel,0)+1
    sortedResult = sorted(classCount.iteritems(),key=op.itemgetter(1),reverse=True)
    return sortedResult[0][0]

main函数

import KNN
import fileOp
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

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

for i in range(testDataSet.shape[0]):
    result.append(KNN.classify(testDataSet[i,:],classfiDataSet,classfiResultSet,5))
print result
print testResultSet


ax.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



向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI