热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

机器学习小记——KNN(K近邻)^_^(一)

为了让绝大多数人都可以看懂,所以我就用简单的话语来讲解机器学习每一个算法第一次写ML的博文,所以可能会有些地方出错,欢迎各位大佬提出意见或错误祝大家开心进步每一天~博文代码全部为p

为了让绝大多数人都可以看懂,所以我就用简单的话语来讲解机器学习每一个算法

第一次写ML的博文,所以可能会有些地方出错,欢迎各位大佬提出意见或错误

祝大家开心进步每一天~

博文代码全部为python

 

简单的说一下什么是机器学习,机器学习英文名称是Machine Learning, ML

机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

机器学习学习形式可分为监督学习,监督学习,半监督学习和强化学习

KNN(k-Nearest Neighbor)中文名为K近邻,是分类算法的一种,KNN的思路为在在数据和标签已知的情况下将测试数据的特征和训练集中的特征进行比较,找到与之最相似的k的数据,那么这个数据对应的类别就是k个数据中出现次数最多的那个类别

寻找相似度有多重方法,最常用的为欧几里得度量,皮尔逊相关系数,余弦相似度

算法流程大致分为 

  1)计算测试数据与各个训练数据之间的距离;

  2)按照距离的递增关系进行排序;

  3)选取距离最小的K个点;

  4)确定前K个点所在类别的出现频率;

  5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

 

本文使用iris数据集,可从UCI处下载    传送门

使用py的三种库pandas,numpy,sklearn

查看数据集

机器学习小记——KNN(K近邻)  ^_^ (一)

 

前4列为特征,最后一列为标签

1 #获取数据
2 X=np.loadtxt("/Users/galan/py/ML-D/iris.data.txt",delimiter=",",dtype=float,usecols=(0,1,2,3))
3 y=np.loadtxt("/Users/galan/py/ML-D/iris.data.txt",delimiter=",",dtype=str,usecols=(4,))
4 #创建训练数据和测试数据
5 X_train,X_test,y_train,y_test=train_test_split(X,y,train_size=.7)

第2,3行为获取特征和标签

第五行中使用sklearn库的train_test_split函数,用来方便分隔测试集和训练集

 

本文使用欧几里得度量算法,在下方也会列出皮尔逊相似性和余弦相似度的py代码

欧几里得度量多为计算空间中两点间的距离

表达式为    |x| = √( x[1]2 + x[2]2 + … + x[n]2 )

代码表现形式为  [(p1-q1)**2+(p2-q2)**2+...+(pn-qn)**2]**0.5

def eculidean(p,q):
    sumSq=0.0
    #讲差值德平方累加起来
    for i in range(len(p)):
        sumSq+=sum(p[i]-q[i])**2
    #求平方根
    return (sumSq**0.5)

 

皮尔逊相关系数是度量两个变量之间相关程度,介于-1和1之间,1代表变量完全正相关,0代表无关,-1代表完全负关系

def pearson(x,y):
    n=len(x)
    vals=range(n)
    #简单求和
    sumx=sum([float(x[i]) for i in vals])
    sumy=sum([float(y[i]) for i in vals])
    #求平方和
    sumxSq=sum([x[i]**2.0 for i in vals])
    sumySq=sum([y[i]**2.0 for i in vals])
    #求乘积之和
    pSum=sum([x[i]*y[i] for i in vals])
    #计算皮尔逊评价值
    num=pSum-(sumx*sumy/n)
    den=((sumxSq-pow(sumx,2)/n)*(sumySq-pow(sumy,2)/n))**.5
    if den==0:return 1
    
    r=num/den
    return r

 

余弦相似度将向量根据坐标值,绘制到向量空间中求得他们的夹角,并得出夹角对应的余弦值,夹角越小,余弦值越接近于1,它们的方向更加吻合,则越相似。

#vect1,vect2位两个一维向量如(1,1)
def getCost(vect1,vect2):
    sum_x=0.0
    sum_y=0.0
    sum_xy=0.0
    for a,b in zip(vect1,vect2):
        sum_xy+=a*b
        sum_x+=a**2
        sum_y+=b**2
        if sum_x==0.0 or sum_y==0.0:
            return None
        else:
            return sum_xy/((sum_x*sum_y)**0.5)

 

knn的求证过程

#K值
k=5
#计算所有的欧氏距离组合成字典
Dists={}
for i in range(len(X_train)):
    Dists[eculidean(X_test[0],X_train[i])]=y_train[i]
#排序字典
sortedDist=sorted(Dists.iteritems(),reverse=True,key=lambda x:x[0])[:k]
classCount={}
#寻找最多的类别标签
for i in sortedDist:
    if i[1] in classCount:
        classCount[i[1]]+=1
    else:
        classCount[i[1]]=1
print classCount

 

下面贴出所有的代码

#coding:utf-8
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

#获取数据
X=np.loadtxt("./ML-D/iris.data.txt",delimiter=",",dtype=float,usecols=(0,1,2,3))
y=np.loadtxt("./ML-D/iris.data.txt",delimiter=",",dtype=str,usecols=(4,))
#创建训练数据和测试数据
X_train,X_test,y_train,y_test=train_test_split(X,y,train_size=.7)

def eculidean(p,q):
    sumSq=0.0
    #讲差值德平方累加起来
    for i in range(len(p)):
        sumSq+=sum(p-q[i])**2
    #求平方根
    return (sumSq**0.5)

def classify(X_train,X_test,k):
    #计算所有的欧氏距离
    Dists={}
    for i in range(len(X_train)):
        Dists[eculidean(X_test,X_train[i])]=y_train[i]
    #排序字典
    sortedDist=sorted(Dists.iteritems(),reverse=True,key=lambda x:x[0])[:k]
    classCount={}
    #寻找最多的类别标签
    for i in sortedDist:
        if i[1] in classCount:
            classCount[i[1]]+=1
        else:
            classCount[i[1]]=1
    return sorted(classCount.iteritems(),key=lambda x:x[1],reverse=True)

if __name__ == '__main__':
    print "%s的类别为%s"%(X_test[15],classify(X_train,X_test[0],5)[0][0])

 

机器学习小记——KNN(K近邻)  ^_^ (一)

我会每周更新一篇ML博文,方便大家学习,^_^ 共同学习共同提高,欢迎大家前来对我的文章提出宝贵意见

祝大家周末愉快~

 


推荐阅读
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
author-avatar
文布得
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有