机器学习入门之机器学习--DIY笔记与感悟--①K-临近算法
小标 2018-10-22 来源 : 阅读 1064 评论 0

摘要:本文主要向大家介绍了机器学习入门之机器学习--DIY笔记与感悟--①K-临近算法,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。

本文主要向大家介绍了机器学习入门之机器学习--DIY笔记与感悟--①K-临近算法,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助。

##“计算机出身要紧跟潮流”

机器学习作为如今发展的趋势需要被我们所掌握。而今我也需要开始learn机器学习,并将之后的所作所想记录在此。
 
今天我开始第一课--K临近算法。
 
一、k-临近的基础概念理解
学习开始前,我将用最简单的话来解释k-临近算法的思想。
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
简单来说,当我们有一定数量的训练值后(例如 Y1(a,b),Y2(c,d),Y3(e,f).....这些数据属于不同的类型)我们就可以把这些点画到二维坐标系中,然后当你拿到一个新的未知数据类型的数据时,你可以把X(x1,x2)放到坐标系上,并测出未知量X与坐标系中所有点的距离,取最近的k个点(这个k是你自己设置的)。之后取这K个值中类型占比最大的那一个作为未知X的类型。

下面是算法的流程总结:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
 
 
二、KNN算法设计
这里首先将这个基础的knn算法用python写出来,我这里使用了python-2.7.10的版本。
这里是用了knn算法,测试样例是四个电影,共有两种类型,每种电影均有两个参数(电影中打斗次数与亲吻次数---二维的数据)。
最终实现给出某一部电影的打斗次数+亲吻次数来预测这是什么类型的电影。

#coding:utf-8
import operator
import numpy as np
def createData():
    group = np.array([[1,101],[5,89],[108,5],[115,8]])
    labels = [‘爱情片‘,‘爱情片‘,‘动作片‘,‘动作片‘]
    return group, labels


#-----------------------------

def classfy(X,dataArray,labels,k):
    dataSize = dataArray.shape[0]
#传入dataArray二维数组的行数
    diffMat = np.tile(X,(dataSize,1)) - dataArray
#tile函数是将X这个数组以在二维里重复datasize次:https://docs.scipy.org/doc/numpy/reference/generated/numpy.tile.html
    squareMat = diffMat**2
#将diffMat平方(为了算距离)
    square_add_Mat = squareMat.sum(axis=1)
#axis=1就是将一个矩阵的每一行向量相加,例如a = np.array([[0, 2, 1]]),print a.sum(axis=1)得到[3](0+1+2)
    distances = square_add_Mat**0.5
#这样就得到了X点与坐标中所有点的距离数组----((X1-X2)^2+(Y1-Y2)^2)^0.5
    sortDistances = distances.argsort()
#将distances从小到大排列出来,返回索引值
    arrayLength = len(sortDistances)
#数据量的个数
    classCount = {}
    for i in range(arrayLength):
        if sortDistances[i]>=k:
            continue#取符合要求的前k个数,当sortDistances[i]>=k时说明当前的数已经不属于k的范围内了
        else:
            currentLabel = labels[i]
            classCount[currentLabel] = classCount.get(currentLabel,0) + 1 
#classCount中放的是键值对,键(为label),值(为出现的次数),get为得到当前classcount数组中为currentLabel这个键的值。
    
    sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
    
#//www.runoob.com/python/python-func-sorted.html   这是sorted的具体用法。
#classCount.iteritems()为将classCount变为字典;key=operator.itemgetter(1)为以第二个参数为基准进行排序(这里指的就是键值对里的值,既按照出现的次数进行排序)。
    
    return sortedClassCount[0][0]
#返回结果


if __name__ == ‘__main__‘:
    group, labels = createData()
#创建数据
    test = [101,20]
    k = 3
#knn的k值,可以自行设计
    test_process = classfy(test,group,labels,k)
    print test_process

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标人工智能机器学习频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程