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

第一次写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

查看数据集

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

 #获取数据
X=np.loadtxt("/Users/galan/py/ML-D/iris.data.txt",delimiter=",",dtype=float,usecols=(0,1,2,3))
y=np.loadtxt("/Users/galan/py/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)

第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])

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

祝大家周末愉快~

机器学习小记——KNN(K近邻) ^_^ (一)的更多相关文章

  1. web安全之机器学习入门——3.1 KNN/k近邻

    目录 sklearn.neighbors.NearestNeighbors 参数/方法 基础用法 用于监督学习 检测异常操作(一) 检测异常操作(二) 检测rootkit 检测webshell skl ...

  2. 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)

    No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...

  3. 机器学习实战python3 K近邻(KNN)算法实现

    台大机器技法跟基石都看完了,但是没有编程一直,现在打算结合周志华的<机器学习>,撸一遍机器学习实战, 原书是python2 的,但是本人感觉python3更好用一些,所以打算用python ...

  4. 基本分类方法——KNN(K近邻)算法

    在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...

  5. 机器学习03:K近邻算法

    本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...

  6. 机器学习 Python实践-K近邻算法

    机器学习K近邻算法的实现主要是参考<机器学习实战>这本书. 一.K近邻(KNN)算法 K最近邻(k-Nearest Neighbour,KNN)分类算法,理解的思路是:如果一个样本在特征空 ...

  7. 02机器学习实战之K近邻算法

    第2章 k-近邻算法 KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法. 一句话总结:近朱者赤近墨者黑! k ...

  8. 机器学习算法之K近邻算法

    0x00 概述   K近邻算法是机器学习中非常重要的分类算法.可利用K近邻基于不同的特征提取方式来检测异常操作,比如使用K近邻检测Rootkit,使用K近邻检测webshell等. 0x01 原理   ...

  9. KNN K~近邻算法笔记

    K~近邻算法是最简单的机器学习算法.工作原理就是:将新数据的每一个特征与样本集中数据相应的特征进行比較.然后算法提取样本集中特征最相似的数据的分类标签.一般来说.仅仅提取样本数据集中前K个最相似的数据 ...

随机推荐

  1. vue 二进制文件的下载(解决乱码和解压报错)

    问题描述:项目中使用的是vue框架进行开发,因为文件下载存在权限问题,所以并不能通过 a 链接的 href 属性直接赋值 URL进行下载, (如果你的文件没有下载权限,可以直接通过href属性赋值UR ...

  2. HDOJ--4893--Wow! Such Sequence!【线段树+单点、区间更新】

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4893 题意:给你一个长度n的数列,初始都为0.有三种操作,第一种给第k个位置的数加d.另外一种是查询区间 ...

  3. 开源 免费 java CMS - FreeCMS1.9 移动APP管理 执行配置

    项目地址:http://www.freeteam.cn/ 移动APP管理 从FreeCMS 1.8開始支持 执行配置 管理会员能够在这里设置移动app的欢迎图片. 从左側管理菜单点击执行配置进入. 选 ...

  4. java上传图片剪切工具类

    package com.up.util; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io. ...

  5. ArtDialog V6的简单使用

    artDialog v6 -- 经典的网页对话框组件,内外皆用心雕琢. 兼容性 測试通过:IE6~IE11.Chrome.Firefox.Safari.Opera 授权协议 免费,且开源.基于LGPL ...

  6. AbstractFactory抽象工厂模式

    #include <iostream> using namespace std; class ProductAbase { public: ProductAbase(){} virtual ...

  7. 带你深度解析Maven

    一.What`s Maven? Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具,简单的说 ...

  8. 37、mysql初识

    之前我们写代码需要存取信息时用的是文件可是用文件存取数据非常局限,今天我们将走进一个新的世界mysql 一.数据库由来 之前所学,数据要永久保存,比如用户注册的用户信息,都是保存于文件中,而文件只能存 ...

  9. while,until

    while ] 注释:中括号写的条件判断式中不能用<.=.>这类符号,要用-lt.-eq.-gt这类符号,且变量前要用$来取值 do sum=$(($sum+$i)) i=$(($i+)) ...

  10. Android 开发,你遇上 Emoji 头疼吗?

    在 Android 中,如果需要使用的到 Emoji 表情,你会发现在某些设备上,有一些 Emoji 表情会被以豆腐块 "☐" 的形式显示,这是因为当前设备并不支持这个 Emoji ...