核心方法:机器学习实战之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、伪原创,思路的出发点是让搜索引擎认为我们的文章属于原创,所以首先要保证你的网站 和原来的网站的主题、结构甚至思想都有很大的不同,比如一个文章