机器学习实战——k-近邻算法 - panpannju

标签: 机器学习 近邻 算法 | 发表时间:2014-04-22 21:32 | 作者:panpannju
出处:

 本章内容

================================

(一)什么是k-近邻分类算法

(二)怎样从文件中解析和导入数据

(三)使用Matplotlib创建扩散图

(四)对数据进行归一化

=================================

 

(一) 什么是k-近邻分类算法

 

简单地说,k-近邻算法采用测量不同特征值之间的距离方法进行分类,k-近邻是一种有监督的分类算法。

k-近邻的工作原理:存在一个样本数据集,也称之为训练样本集,并且样本集中的每个数据都存在标签,即每个样本所属的类别。输入没有标签的新数据,将新数据的每个特征与样本数据集中的每一个数据的特征进行比较,然后提取与新数据最相似的k个样本数据集,根据这k个样本数据集的类别标签,这k个样本数据中出现最多的类别即为新数据的类别标签。

 

举例:根据表中提供的信息,求最后一部电影的电影类型?下图是每部电影的打斗镜头数、接吻镜头数以及电影评估类型

本文结合k-近邻分类算法的一般步骤,利用python代码实现。

k-近邻分类算法的一般步骤:

(1)导入数据

1 from numpy import *
2 import operator
3
4 def createDataSet():
5 '''
6 Use two arrays represent the information of chart.
7 '''
8 group = array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]])
9 label = ['love','love','love','action','action','action']
10 return group, label

(2)分类器的实现

1 def classify(x, dataSet, label, k):
2 '''
3 The kNN classifier.
4 '''
5
6 '''
7 Compute the distance
8 '''
9 # shape return [m,n]
10 # m is the row number of the array
11 # n is the column number of the array
12 dataSetSize = dataSet.shape[0]
13 # tile can expand a vector to an array
14 # (dataSetSize, 1) expand row and column
15 # x = [1,3]
16 # print(tile(x,(3,1)))
17 # result [[1,3],[1,3],[1,3]]
18 diffMat = tile(x, (dataSetSize, 1)) - dataSet
19 sqDiffMat = diffMat ** 2
20 # sqDistance is a 1 x m array
21 sqDistance = sqDiffMat.sum(axis=1)
22 distances = sqDistance ** 0.5
23
24 '''
25 Choose the k samples, according to the distances
26 '''
27 sortedDistIndicies = distances.argsort()
28 classCount = {}
29 for i in range(k):
30 voteIlabel = label[sortedDistIndicies[i]]
31 classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
32
33 '''
34 Sort and find the max class
35 '''
36 sortedClassCount = sorted(classCount.iteritems(),
37 key = operator.itemgetter(1),
38 reverse = True)
39 return sortedClassCount[0][0]

(3)测试新数据

group , labels = createDataSet()
x = [18, 90]
print(classify(x,group,labels,3))

(4)实验结果

 1 love 

 

 

===========================================

 

(二)怎样从文件中解析和导入数据

一般原始的数据存放在文本文件中,每个样本占据一行,N个样本就有N行.每个样本数据有n个特征,最后一列为样本的类别。

怎样将数据从文件中读取到数组中呢?

1 def file2matrix(filename, n):
2 f = open(filename)
3 arrayOLines = f.readlines()
4 numberOfLines = len(arrayOLines)
5 returnMat = zeros((numberOfLines,n))
6 classLabelVector = []
7 index = 0
8 for line in arrayOLines:
9 line = line.strip()
10 listFormLine = line.split('\t')
11 returnMat[index,:] = listFormLine[0:n]
12 classLabelVector.append(int(listFormLine[-1]))
13 index += 1
14 return returnMat, classLabelVector

 

 

==========================================

 

(三)使用Matplotlib创建散点图分析数据

Matplotlib可以将数据的两种类型的特征表示在一张2D的图中。

1 import matplotlib.pyplot as plt
2 from numpy import *
3 datmax = array([[2,3],[4,5]])
4 plt.scatter(datmax[:,0],datmax[:,1])
5 plt.xlabel('Feature0')
6 plt.ylabel('Feature1')
7 plt.show()

结果如下:

 

 

============================================

 

(四)归一化数值

 

如下图所示,我们很容易发现,使用欧式距离衡量数据之间的相似度,特数字差值最大的特征对计算结果影响最大,就如下图,每年获得的飞行常客里程数这个特征对计算结果的影响远大于其他两个特征的影响。若训练过程中,我们认为每一特征是等权重的。

在处理这种不同取值范围的特征值时,我们通常采用的方法是将数值归一化,将取值范围处理为[0,1]或[-1,1]。

本文以最大最小进行归一化:

1 from numpy import *
2
3 def autoNorm(dataSet):
4 '''
5 Use Max-min method to normalize the feature value
6 '''
7
8 # find the min value of each feature
9 # minVals is a 1 X m (m is the number of feature)
10 minVals = dataSet.min(0)
11 # find the max value of each feature
12 # maxVals is a 1 X m (m is the number of feature)
13 maxVals = dataSet.max(0)
14 ranges = maxVals - minVals
15 normDataSet = zeros(shape(dataSet))
16 # the number of samples
17 m = dataSet.shape[0]
18 normDataSet = dataSet - tile(minVals,(m,1))
19 normDataSet = normDataSet / tile(ranges,(m,1))

 

===========================================

 

(五)总结

优点:精度高、对异常值不敏感、无数据输入假定。

缺点:计算复杂度高、空间复杂度高。

使用数据范围:数值型和标称型。

 

 

 

 


本文链接: 机器学习实战——k-近邻算法,转载请注明。

相关 [机器学习 近邻 算法] 推荐:

机器学习实战——k-近邻算法 - panpannju

- - 博客园_首页
(一)什么是k-近邻分类算法. (二)怎样从文件中解析和导入数据. (三)使用Matplotlib创建扩散图. (一) 什么是k-近邻分类算法. 简单地说,k-近邻算法采用测量不同特征值之间的距离方法进行分类,k-近邻是一种有监督的分类算法. k-近邻的工作原理:存在一个样本数据集,也称之为训练样本集,并且样本集中的每个数据都存在标签,即每个样本所属的类别.

机器学习算法Boosting

- - 标点符
机器学习通常会被分为2大类:监督学习和非监督学习. 在监督学习中,训练数据由输入和期望的输出组成,然后对非训练数据进行预测输出,也就是找出输入x与输出y之间的函数关系F:y = F(x). 根据输出的精确特性又可以分为分类和回归. 分类和回归的区别在于输出变量的类型. 定量输出称为回归,或者说是连续变量预测.

Mahout实现的机器学习算法

- - ITeye博客
使用命令:mahout -h.   在Mahout实现的机器学习算法见下表:. EM聚类(期望最大化聚类). 并行FP Growth算法. 并行化了Watchmaker框架. 非Map-Reduce算法. 扩展了java的Collections类. Mahout最大的优点就是基于hadoop实现,把很多以前运行于单机上的算法,转化为了MapReduce模式,这样大大提升了算法可处理的数据量和处理性能.

机器学习算法选用指南

- - IT瘾-geek
在从事数据科学工作的时候,经常会遇到为具体问题选择最合适算法的问题. 虽然有很多有关机器学习算法的文章详细介绍了相关的算法,但要做出最合适的选择依然非常困难. 在这篇文章中,我将对一些基本概念给出简要的介绍,对不同任务中使用不同类型的机器学习算法给出一点建议. 在文章的最后,我将对这些算法进行总结.

Mahout实现的机器学习算法一览表

- - ITeye博客
         Apache Mahout 是 ApacheSoftware Foundation (ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序,并且,在 Mahout 的最近版本中还加入了对Apache Hadoop 的支持,使这些算法可以更高效的运行在云计算环境中.

流行的机器学习算法概述

- - CSDN博客推荐文章
  本文我们会概述一些流行的机器学习算法. 机器学习算法很多,并且它们自身又有很多延伸. 因此,如何确定解决一个问题的最好算法是很困难的. 下面我们先说基于学习方式对算法的分类和算法之间的相似性,让大家有个整体意识;接着再陈述各类算法. 一、基于学习方式对算法的分类. 根据如何处理经验、环境或者任何我们称之为输入的数据,算法分为不同种类.

机器学习的分类与主要算法对比

- - CSDN博客综合推荐文章
重要引用: Andrew Ng Courera Machine Learning; 从机器学习谈起; 关于机器学习的讨论; 机器学习常见算法分类汇总; LeNet Homepage; pluskid svm.   首先让我们瞻仰一下当今机器学习领域的执牛耳者:.   这幅图上的三人是当今机器学习界的执牛耳者.

基于机器学习方法的POI品类推荐算法 -

- -
在美团商家数据中心(MDC),有超过100w的已校准审核的POI数据(我们一般将商家标示为POI,POI基础信息包括:门店名称、品类、电话、地址、坐标等). 如何使用这些已校准的POI数据,挖掘出有价值的信息,本文进行了一些尝试:利用机器学习方法,自动标注缺失品类的POI数据. 例如,门店名称为“好再来牛肉拉面馆”的POI将自动标注“小吃”品类.

[译] 如何选择正确的机器学习算法?

- - IT瘾-dev
机器学习既是一门科学,也是一种艺术. 纵观各类机器学习算法,并没有一种普适的解决方案或方法. 事实上,有几个因素会影响你对机器学习算法的选择. 有些问题是非常特别的,需要用一种特定的解决方法. 例如,如果你对推荐系统有所了解,你会发现它是一类很常用的机器学习算法,用来解决一类非常特殊的问题. 而其它的一些问题则非常开放,可能需要一种试错方法(例如:强化学习).

机器学习算法之主成分分析PCA

- - 标点符
主成分分析(Principal components analysis,以下简称PCA)是最重要的降维方法之一. 在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用. 一般我们提到降维最容易想到的算法就是PCA,下面我们就对PCA的原理做一个总结. 首先考虑一个问题:对于正交属性空间中的样本点,如何用一个超平面(直线的高维推广)对所有样本进行恰当的表达.