一些碎碎念:失踪人口回归(虽然也没人fo我,一个人自娱自乐啦)。新学期开始好久了,感觉需要系统性地学习一些东西,扫了一眼书架发现之前买的《机器学习实战》这本书还没看完,于是从这本书开始搭建自己的机器学习基础体系啦,顺便学习一下python。如果正文有什么描述不对的地方,麻烦给与指正啦...争取周更,不能拖拉。
star了一个github项目(本书配套代码) https://github.com/pbharrin/machinelearninginaction
kNN算法是分类算法,主要是通过测量比较 输入测试数据 与 分类过的训练数据 的(特征)距离 进行分类的。当输入一个新的未分类(没有标签)的数据时,与样本集中的数据特征进行比较,选出与新数据最接近的k个数据,将出现频率最高的分类作为新数据的分类。
首先需要对数据进行处理,数据清洗和归一化,数据清洗是为了剔除异常数据,归一化是为了使各个特征不受数据取值大小的影响,当然也可以根据数据的重要性定权重。
以下是kNN的核心代码:
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() classCout = {} for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] classCout[voteIlabel] = classCout.get(voteIlabel, 0) + 1 sortedClassCout = sorted(classCout.items(), key = operator.itemgetter(1), reverse = True) return sortedClassCout[0][0]
其中inX是输入数据(向量形式),dataSet和labels分别是样本数据和标签(分类),k是参与评价的点数。
代码首先求了输入数据与样本数据的距离,然后对距离排序,选出距离最近的k个点,返回k点内出现频率最高的标签作为分类结果。
此处距离的求解方法是欧式距离,还可以选用其他距离公式,视具体数据情况为定。
kNN简单有效但是当数据集较大时,所需内存和计算量也较大,也不能体现出各个数据特征之间的区别,这种分类方法还是十分硬核的,适用于简单的情况。