机器学习算法一——k-近邻算法(1)

本文深入探讨k-近邻算法的基本原理与实现过程,通过具体示例展示如何使用Python进行数据分类。从数据导入、预处理到算法应用,全面解析kNN算法的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

机器学习算法一——k-近邻算法(1)

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

kNN工作原理:训练样本集中每个数据有一个一一对应的所属分类的标签。需要分类的新数据没有标签,将新数据的每个特征与样本集中数据对应的特征进行比较,然后将样本集中与其特征最相似(最近邻)的数据标签作为新数据的标签。

一般来说,我们选择样本集中前k个最相似的数据(通常k<=20)中,出现次数最多的,作为新数据的分类。

使用python导入数据

from numpy import *  #科学运算包
import operator      #运算符模块
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 

#从文本文件中解析数据
def classify0(inX,dataSet,labels,k): #(新数据,训练集数据,训练集标签,最近邻数)
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX,(dataSetSize,1)) - dataSet
    sqDiffMat = diffMat**2  #各个元素分别平方
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5 #开根得到距离
    sortedDistIndicies = distances.argsort()
    classCount={} #初始化classCount
    for i in range(k): #选择欧式距离最小的k个点
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 
    sortedClassCount = sorted(classCount.items(),
                              key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

(1)tile()
将inX二维数组化,变成dataSetSize行1列 在这里插入图片描述

(2)sum()函数
sum(axis=1)表示矩阵中行之间数的求和;
sum(axis=0)表示矩阵中对列求和
在这里插入图片描述

(3)argsort()函数
argsort()函数的具体功能如下:

import numpy as np
x = np.array([1,4,3,-1,6,9])
y = x.argsort()
>>>y=array([3,0,2,1,4,5])

发现argsort()函数是将x中的元素从小到大排列,输出其对应的index(索引)。
例如:x[3]=-1最小,所以y[0]=3;x[5]=9最大,所以y[5]=5。

(4)classCount.get()函数
检测并生成新元素,0只做初始化作用,计数,遇到相同的加1

for i in range(k): #选择欧式距离最小的k个点
      voteIlabel = labels[sortedDistIndicies[i]]
      classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 

令k=3
假设labels = [‘A’,‘A’,‘A’,‘B’,‘B’,‘B’]
假设sortedDistIndicies = [1,3,0]
那么
-------------------------、
当k=0,

voteIlabel = labels[sortedDistIndicies[0]] 
           = labels[1] = 'A'
classCount['A'] = classCount.get('A',0) + 1 
>>>classCount = {'A':1}

当k=1,

voteIlabel = labels[sortedDistIndicies[1]] 
           = labels[3] = 'B'
classCount['B'] = classCount.get('B',0) + 1 
>>>classCount = {'B':1}

当k=2,

voteIlabel = labels[sortedDistIndicies[2]] 
           = labels[0] = 'A'
classCount['A'] = classCount.get('A',0) + 1 
>>>classCount = {'A':2}
>>>classCount = {'A':2,'B':1}

(5)sorted()函数
sorted(iterable, key=None, reverse=False)
iterable为排序对象
key表示按什么要素排序
reverse默认False表示升序

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

classCount.items()返回的是dict_items,将classCount字典分解为元组列表
注意:python2的iteritems()转为python3的items()
在这里插入图片描述
operator.itemgetter(1)表示对classCount的第2个域进行排序(即标签频次)
reverse=True表示是升序排列

至此,分类器建成,测试结果如下
在这里插入图片描述

到目前为止,人们提出了许多神经网络模型,其中应用最广泛的是前馈神经网络.早期前馈神经网络中只含有求和神经元,在处理复杂非线性问题时效率很低.后来,人们将求积神经元引入到前馈神经网络中,用以增加网络的非线性映射能力,提高网络的学习效率.这样的网络可以统称为高阶前馈神经网络.但是,如果只通过输入节点值的简单乘积构造求积神经元以增加网络的非线性映射能力,随着输入样本维数的增加,所需权值的数量呈指数阶增加,即出现“维数灾难”.Pi-Sigma 神经网络是1991 年Y.Shin提出的种具有多项式乘积构造的求积神经元的高阶前馈神经网络.该网络既提高网络的非线性映射能力,又避免了“维数灾难”的出现.此后,为了提高该网络的应用能力,Y.Shin、A.J. Hussaina、C.K. Li 等又以Pi-Sigma 神经网络为模块构造了更复杂的网络结构,并在模式分类和函数逼近等问题中取得成功应用. 学者们对只含有求和神经元的前馈神经网络的收敛性、泛化能力等理论问题已有深入研究,而对含有求积神经元的高阶前馈神经网络的研究主要集中在实际应用上,相关理论方面的研究还很薄弱,仍存在许多有待解决的基本理论问题.因此,从理论上分析 Pi-Sigma 神经网络学习算法的学习能力和收敛性具有很重要的实际意义,这些问题的研究和解决将对 Pi-Sigma 神经网络的应用起到重要的促进作用. 梯度算法种简单又常用的神经网络训练算法,从样本的输入方式看,包括批处理和在线两种运行方式:从权值向量的更新方式来看,包括同步和异步两种更新方式.本论文主要研究用于训练 Pi-Sigma 神经网络的几种梯度学习算法的相关理论问题,包括学习效率、收敛性等.另外,在网络结构优化方面做了些尝试. 本论文的结构及内容如下: 第章回顾有关神经网络的些背景知识. 第二章指出随机单点在线梯度算法训练 Pi-Sigma 神经网络过程中因权值较小会降低网络收敛速度的问题,并从理论上分析了这种现象产生的原因及权值更新受影响的程度.同时,为解决该问题,给出了种带惩罚项的随机单点在线梯度算法. 第三章讨论 Pi-Sigma 神经网络异步批处理梯度算法和带动量项的异步批处理梯度算法的收敛性问题.将动量项引入到训练 Pi-Sigma 神经网络的异步批处理梯度算法中,有效地改善了算法的学习效率,给出误差函数的单调性定理及该算法的弱收敛和强收敛性定理及证明,并通过计算机仿真实验验证理论分析的正确性. 第四章分析 Pi-Sigma 神经网络在线梯度算法的收敛性问题并给出收敛性结论. 第五章提出基于灰色关联分析的种新的剪枝算法,并将其用于训练前馈神经网络 (包括多层前馈神经网络和 High-Order 神经网络).该算法运用狄色关联分析对比网络各节点输出值序列之问联系的紧密程度,实现网络结构的动态修剪.训练后的神经网络具有较合理的网络拓扑结构和较好的泛化能力.实例验证该算法的合理性、有效性.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值