机器学习实战python与R共舞

本文详细介绍了kNN分类算法的Python和R语言实现,并对比了两种语言在处理数据上的优势。通过具体代码实例,深入探讨了算法的工作原理及应用。

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

机器学习实战中的代码,学习并交流。第一个是kNN分类函数。以下是Python的代码,后来也尝试用R写了一下,发现他们在处理数据上R还是很强大的。

#!/usr/bin/python
from numpy import *
import operator

def classfy0(inX,dataSet,labels,k):
    dataSetSize=dataSet.shape[0]  # shape 方法获得数据的行数和列数,然后选取行数
    diffMat=tile(inX,(dataSetSize,1))-dataSet #tile 方法是数组的重复,里边的元祖表示的是对这个数组重复的纬度,这里表示几行几列
    sqDiffMat=diffMat**2
    sqDistances=sqDiffMat.sum(axis=1)  #按照行来对计算的平方和求加,下一步计算距离
    distances=sqDistances**0.5
    sortedDistIndicies=distance.argsort() #获取距离的数据进行排序
    classCount={}
    for i in range(k):
        voteIlabels=labels[sortedDistIndicies[i]]        #获得排序的前k个元素,sortedDistIndicies[i] 是排序后距离值的索引,这个索引也是label的索引。每个元素的标签是新建字典的键
    classCount[voteIlabels]=classCount.get(voteIlabels,0)+1 # 字典的值是每个字典的键出现的次数的累计,get方法内输入0,表示
    #如果不存在该键,则得到的值就是输入的值,这里因为创建的是空字典,每一个键的输入都是不存在的,第二次输入的时候,在上一个的计数上加1
    sortedClassCount=sorted(classCount.iteritems(), 
    key=operator.itemgetter(1),reverse=True)    #对字典进行排序,sorted中的参数key是operator.itemgetter取第一个类型,
    #也就是按照字典的值来排序
    return sortedClassCount[0][0]  #返回排序后是一个元祖,返回第一个元祖的第一个值。

下边是R的代码,由于是初学,附上了很多注释,还望见谅。

kNN<-function(input, dataset,label,k){
    if(class(input)!="numeric") stop(cat("you must input a numeric vector"))
    if(class(dataset)!="matrix") stop(cat("you mush input your traning data as a matrix"))
    datasize=nrow(dataset)
    diffMat=matrix(rep(input,datasize),nrow=datasize,byrow = TRUE)-dataset
    sqDiffMat=diffMat^2
    sqDistances=apply(sqDiffMat,1,sum)
    distances=sqrt(sqDistances)
    sortedDistIndicies=order(distances)
    classCount=list()              #创建一个空列表,列表的名字是标签,列表的内容是前k个标签中,某个标签出现的次数
    for(i in 1:k){
        name=label[sortedDistIndicies[i]]       #获取前k个排序后的标签的名字sortedDistIndicies[i] 是获得排序后距离值的索引,这个索引也是label的索引。
        classCount[[name]]=c(classCount[[name]],1) #并把标签出现的次数赋值为标签的内容,classCount[[name]] 是null,
    #因为这个是个空列表,每次如果出现这个标签,就加上1
    }
    results=lapply(classCount, function(x) sum(x)) #对列表中的数据进行相加,看出现的频率
    return(results[1])
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值