机器学习第一周

kNN算法又称为k近邻分类(k-nearest neighbor classification)算法。
K近邻是一种基本分类与回归的方法
可以简单粗暴的认为是:K个最近的邻居,当K=1时,算法便成了最近邻算法,即寻找最近的那个邻居。为何要找邻居?
打个比方来说,假设你来到一个陌生的村庄,现在你要找到与你有着相似特征的人群融入他们,所谓入伙。
或者,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出了。
其实这两个例子就是运用了KNN的思想。KNN方法既可以做分类,也可以做回归,这点和决策树算法相同。
用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属于某个类,就把该输入实例分类到这个类中。
算法思想:简单的说就是,找到最“近”的k个邻居,然后按照他们的多数作为分类标签,或者按照他们的均值作为回归预测结果(“投票法“和“平均法”),一些情况会考虑结合距离进行加权投票和加权平均,距离越近的权重越大。

目标函数: 没有,没有显示学习过程,所以也不需要优化,只需要验证K值是否合理(交叉验证)

算法缺点:所有的计算都在预测的时候进行,属于”急切学习“会比较耗内存,由于算法假设采样密度足够大,所以当维度比较多时,样本量需求会比较大,计算距离都会比较困难,当然这属于所有机器学习方法的共同问题,被称为”维度灾难“,但是由于KNN把所有的计算都放到了一起,所以问题可能会更为突出。解决方向——降维。

算法优点:原理简单易懂;天然可处理多分类问题

相关代码:
form 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 = diffMat2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances
0.5
# 计算完所有点的距离后,对数据按照从小到大的次序排序
sortedDistIndicies = distances.argsort()
# 确定前k个距离最小的元素所在的主要分类,最后返回发生频率最高的元素类别
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值