• KNN-机器学习算法


    '''
    Created on Sep 16, 2010
    kNN: k Nearest Neighbors
    
    Input:      inX: vector to compare to existing dataset (1xN)
                dataSet: size m data set of known vectors (NxM)
                labels: data set labels (1xM vector)
                k: number of neighbors to use for comparison (should be an odd number)
                
    Output:     the most popular class label
    
    @author: pbharrin
    '''
    from numpy import *
    #NumPy是Python语言的一个扩展程序库。支持高端大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
    import pdb
    pdb.set_trace()#用于调试
    import operator#operator 模块是 Python 中内置的操作符函数接口,它定义了算术,比较和与标准对象 API 相对应的其他操作的内置函数。
    #operator 模块是用 C 实现的,所以执行速度比 Python 代码快。
    from os import listdir#os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。 它不包括 '.' 和'..' 即使它在文件夹中。
    
    def classify0(inX, dataSet, labels, k):
        #这个方法每次只能处理一个样本
        #这里的dataSet是一个数组,inX是待分类的样本,K是neighbor的数量
        #inX是以行向量的方式储存的,dataSet也是一行表示一个样本
        #KNN算法几乎不需要“训练”,属于即开即用那种的
        dataSetSize = dataSet.shape[0]#这是样本个数
        diffMat = tile(inX, (dataSetSize,1)) - dataSet#ile()函数内括号中的参数代表扩展后的维度,而扩展是通过复制A来运作的,最终得到一个与括号内的参数(reps)维度一致的数组(矩阵)
        #将inX复制为和样本一样多的行数
        sqDiffMat = diffMat**2
        sqDistances = sqDiffMat.sum(axis=1)#sum对array求和,如果参数是0,就按列求和,返回一个行向量;如果参数是1,就按行求和,但是也返回一个行向量(从计算的角度来看,是列向量转置之后的)
        distances = sqDistances**0.5#**是python中的幂运算,用在矩阵上的效果的对应位置相乘而不是矩阵乘法中的A*A
        ##现在distances中的每一个元素代表了待求目标点和每一个样本点之间的距离
        sortedDistIndicies = distances.argsort() #argsort是numpy的方法,从小到大排序(不加参数的话),返回的是index而不是排序后的元素本身   
        classCount={}#这是个字典类型
        
        (labels)
        for i in range(k):
            voteIlabel = labels[sortedDistIndicies[i]]
            classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1#给这个类型加一
        sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)#选出k中数量最大的label
        return sortedClassCount[0][0]##输出最大的label
    
    def createDataSet():
        group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
        #[[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]是list类型的二维向量,转成array可以方便进行向量化计算(array是numpy封装的)
        labels = ['A','A','B','B']
        return group, labels
    group,labels=createDataSet()
    classify0([0,0],group,labels,3)
    
  • 相关阅读:
    C# 根据当前登录的用户信息,显示数据库中登录用户的照片
    C# 根据当前系统时间,显示 Good Morning/Afternoon/Evening
    C# 根据用户性别,在身份证号输入框后 面显示问候信息,格式为:“Mrs./Mr. Name”。
    C# 窗体登录,按照他们的角色跳转到不同的主界面
    C# 实现模拟下载功能,被下载的文件存储在本地
    C# 鼠标移动到图片上显示提示文字
    C# 隔一段时间自动刷新弹框(医院病人超时提醒)
    C# winform 点击窗体内不同按钮显示不同的文字
    gulp的安装和使用
    es6 面向对象
  • 原文地址:https://www.cnblogs.com/jiading/p/11621975.html
Copyright © 2020-2023  润新知