核心方法:机器学习实战之KNN算法

优采云 发布时间: 2022-11-18 09:15

  核心方法:机器学习实战之KNN算法

  本系列教程是《实用机器学习》的阅读笔记。首先说一下写这个系列教程的原因:首先,《机器学习实战》的代码是用Python2写的,有些代码在Python3上运行会报错。本教程基于Python3修改代码;second: 看了一些机器学习的书没有记录下来,很快就忘记了。写教程也是一个复习的过程;第三,机器学习比爬虫和数据分析更难学。希望通过这一系列的教程,让读者在学习机器学习的道路上少走弯路。

  本系列教程特色:哪些读者可以吃饱:k近邻算法(KNN)原理

  KNN算法是一种分类算法。古语这样描述KNN算法:“近朱者红,近墨者黑”。

  算法原理:计算测试样本与每个训练样本的距离(距离计算方法见下文),取距离最小的前k个训练样本,最后选取这k个样本中出现次数最多的类别作为类别的测试样本。

  如图,绿色的就是测试样例。当k为3时,样本属于红色类;当k为5时,属于蓝色类。因此,k值的选择极大地影响了算法的结果,通常k值不大于20。

  KNN算法原理

  介绍完原理,再看看KNN算法的伪代码流程:

  计算测试样本与所有训练样本的距离

对距离进行升序排序,取前k个

计算k个样本中最多的分类

  KNN的约会对象分类问题描述及数据情况

  Helen 使用 Dating网站 查找约会对象。随着时间的推移,她发现自己约会过三种类型的人:

  这里 Helen 采集了 1000 行具有三个特征的数据:每年赚取的飞行常客里程数;玩视频游戏的时间百分比;每周消耗的冰淇淋升数。以及对象的类型标签,如图所示。

  数据情况

  分析数据

  import numpy as np

import operator

def file2matrix(filename):

fr = open(filename)

arrayOLines = fr.readlines()

numberOflines = len(arrayOLines)

returnMat = np.zeros((numberOflines, 3))

classLabelVector = []

index = 0

for line in arrayOLines:

line = line.strip()

listFromLine = line.split('\t')

returnMat[index, :] = listFromLine[0:3]

classLabelVector.append(int(listFromLine[-1]))

index = index + 1

return returnMat, classLabelVector

  定义解析数据的函数: 第4-9行:读取文件,获取文件行数,创建一个以文件行数(1000行)3列全0的Numpy数组,创建用于存储类标签的 classLabelVector 列表。

  第 10-17 行:循环遍历文件,将前三列数据存储在 returnMat 数组中,并将最后一列存储在 classLabelVector 列表中。结果如图所示。

  分析数据

  上面的代码是书上写的。其实用pandas读取数据然后出来是很方便的。代码如下:

  import numpy as np

<p>

import operator

import pandas as pd

def file2matrix(filename):

data = pd.read_table(open(filename), sep='\t', header=None)

returnMat = data[[0,1,2]].values

classLabelVector = data[3].values

return returnMat, classLabelVector

</p>

  归一化

  由于特征的取值差异较大,在计算距离时,取值较大的属性对结果的影响较大。这里,数据需要归一化:new = (old-min)/(max-min)。代码如下:

  def autoNorm(dataSet):

minval = dataSet.min(0)

maxval = dataSet.max(0)

ranges = maxval - minval

normDataSet = np.zeros(np.shape(dataSet))

m = dataSet.shape[0]

normDataSet = dataSet - np.tile(minval, (m,1))

normDataSet = normDataSet/np.tile(ranges, (m,1))

return normDataSet, ranges, minval

  传入的参数为测试数据(即returnMat);先按0轴(即按列)计算min和max,如图所示进行简单示例;然后构造一个与数据(normDataSet)大小相同的0矩阵;

  瓦片功能的使用方法请读者自行百度。下面是使用后的案例。作用是让一维数组重复m行,如图所示,这样就可以进行数据归一化的计算。

  例子

  例子

  结果

  KNN算法

  这里使用的距离是欧氏距离,公式为:

  欧氏距离

  def classify(inX, dataSet, labels, k):

dataSize = dataSet.shape[0]

diffMat = np.tile(inX, (dataSize,1)) -dataSet

sqdiffMat = diffMat ** 2

sqDistance = sqdiffMat.sum(axis = 1)

distances = sqDistance ** 0.5

sortedDist = distances.argsort()

classCount ={}

for i in range(k):

voteIlable = labels[sortedDist[i]]

<p>

classCount[voteIlable] = classCount.get(voteIlable, 0) + 1

sortedClassCount = sorted(classCount.items(),

key=operator.itemgetter(1), reverse=True)

return sortedClassCount[0][0]

</p>

  inX 是训练数据;dataSet为测试数据,labels为类别标签;k 是值;

  第 2-6 行:计算欧式距离

  7-Finally:对计算出的距离进行索引排序(argsort),然后对字典进行排序,得到值最多的分类。

  测试分类器

  这里选取前10%的数据作为测试样本来测试分类器。

  def test():

r = 0.1

X, y = file2matrix('数据/datingTestSet2.txt')

new_X, ranges, minval = autoNorm(X)

m = new_X.shape[0]

numTestVecs = int(m*r)

error = 0.0

for i in range(numTestVecs):

result = classify(new_X[i, :],new_X[numTestVecs:m, :], y[numTestVecs:m], 3)

print('分类结果: %d, 真实数据: %d' %(result, y[i]))

if (result != y[i]):

error = error + 1.0

print('错误率: %f' % (error/float(numTestVecs)))

  结果

  测试系统

  最后写一个简单的测试系统,代码可以通过人为输入三个属性特征自动得到交友对象的分类标签。

  def system():

style = ['不喜欢', '一般', '喜欢']

ffmile = float(input('飞行里程'))

game = float(input('游戏'))

ice = float(input('冰淇淋'))

X, y = file2matrix('数据/datingTestSet2.txt')

new_X, ranges, minval = autoNorm(X)

inArr = np.array([ffmile, game, ice])

result = classify((inArr - minval)/ranges, new_X, y, 3)

print('这个人', style[result - 1])

  结果

  算法优缺点写在最后

  乍一看,读者可能会觉得不舒服,多敲几下代码就可以了。欢迎大家点赞评论,也可以微博和我互动(我是罗罗盘)。

  干货教程:首页 > seo教程>> seo优化培训教程之伪原创技巧方法

  

  1、要改写的文章必须收录你要优化的关键词。不要完全模仿原文的标题,这样搜索引擎会重点将其与原文进行比较,这样你的文章风险系数就非常高了。当然,如果能在标题中加入营销元素就完美了,这样更容易吸引客户点击。2、现在不要以为一个文章的段落随便打乱就可以了。现在的搜索引擎很聪明,所以这里我建议最好把同一个话题的多个文章拼凑起来。拥有 文章。在这个过程中,一定要用自己的语言进行过渡,让文章读起来流畅自然,同时删除原文中多余或不相关的内容。3.注意关键词的密度和布局控制。这里笔者多年的经验建议,最好着重写开头和结尾,最好在开头和结尾收录要优化的关键词。4.在文本中的某些节点添加自己的内容,比如添加自己的网站相关的文章标题,然后用锚文本指向他们,添加自己的网站名字, each在段后加一些额外的句子等 seo伪原创的内容怎么写 1.为了避免原文作者起诉你侵犯版权,建议你在文末加上相关参考文章,因为无论您如何伪原创,中心思想是不能变的。2、对于一些文章,比如一些技术性的文章,确实很难改。这时候可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎是也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章 可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章 可以在文章中插入自己的理解和观点,并注明自己的索引来源,这也算伪原创,但不算抄袭,搜索引擎也比较放松警惕!!3、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线