本章内容

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

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

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

(三)使用Matplotlib创建扩散图

(四)对数据进行归一化

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

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

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

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

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

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

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

(1)导入数据

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

(2)分类器的实现

 def classify(x, dataSet, label, k):
'''
The kNN classifier.
''' '''
Compute the distance
'''
# shape return [m,n]
# m is the row number of the array
# n is the column number of the array
dataSetSize = dataSet.shape[0]
# tile can expand a vector to an array
# (dataSetSize, 1) expand row and column
# x = [1,3]
# print(tile(x,(3,1)))
# result [[1,3],[1,3],[1,3]]
diffMat = tile(x, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
# sqDistance is a 1 x m array
sqDistance = sqDiffMat.sum(axis=1)
distances = sqDistance ** 0.5 '''
Choose the k samples, according to the distances
'''
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = label[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 '''
Sort and find the max class
'''
sortedClassCount = sorted(classCount.iteritems(),
key = operator.itemgetter(1),
reverse = True)
return sortedClassCount[0][0]

(3)测试新数据

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

(4)实验结果

love

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

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

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

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

 def file2matrix(filename, n):
f = open(filename)
arrayOLines = f.readlines()
numberOfLines = len(arrayOLines)
returnMat = zeros((numberOfLines,n))
classLabelVector = []
index = 0
for line in arrayOLines:
line = line.strip()
listFormLine = line.split('\t')
returnMat[index,:] = listFormLine[0:n]
classLabelVector.append(int(listFormLine[-1]))
index += 1
return returnMat, classLabelVector

 

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

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

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

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

结果如下:

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

(四)归一化数值

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

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

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

 from numpy import *

 def autoNorm(dataSet):
'''
Use Max-min method to normalize the feature value
''' # find the min value of each feature
# minVals is a 1 X m (m is the number of feature)
minVals = dataSet.min(0)
# find the max value of each feature
# maxVals is a 1 X m (m is the number of feature)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
normDataSet = zeros(shape(dataSet))
# the number of samples
m = dataSet.shape[0]
normDataSet = dataSet - tile(minVals,(m,1))
normDataSet = normDataSet / tile(ranges,(m,1))
20 return normDataSet, minVals, ranges

测试数据:

10%作为测试集

90%作为训练集

 def datingClassTest():
'''
Test
'''
# hold out 10%
hoRatio = 0.10
# load dataSet file
datingDataMat, datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom file
normMat, ranges, minVals = autoNorm(datingDataMat)
m = normMat.shape[0]
numTestVecs = int(m*hoRatio)
errorCount = 0.0
for i in range(numTestVecs):
classifierResult = classify(normMat[i], normMat[numTestVecs:m], datingLabels[numTestVecs:m], 3)
if (classifierResult != datingLabels[i]):
errorCount += 1.0
print ("the total error rate is: %f" % (errorCount/float(numTestVecs)))
print errorCount,numTestVecs

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

(五)总结

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

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

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

机器学习实战——k-近邻算法的更多相关文章

  1. 机器学习实战-k近邻算法

    写在开头,打算耐心啃完机器学习实战这本书,所用版本为2013年6月第1版 在P19页的实施kNN算法时,有很多地方不懂,遂仔细研究,记录如下: 字典按值进行排序 首先仔细读完kNN算法之后,了解其是用 ...

  2. 机器学习之K近邻算法(KNN)

    机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...

  3. 【机器学习】k近邻算法(kNN)

    一.写在前面 本系列是对之前机器学习笔记的一个总结,这里只针对最基础的经典机器学习算法,对其本身的要点进行笔记总结,具体到算法的详细过程可以参见其他参考资料和书籍,这里顺便推荐一下Machine Le ...

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

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

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

    K 近邻 (K-nearest neighbor, KNN) 算法直接作用于带标记的样本,属于有监督的算法.它的核心思想基本上就是 近朱者赤,近墨者黑. 它与其他分类算法最大的不同是,它是一种&quo ...

  6. [机器学习实战] k邻近算法

    1. k邻近算法原理: 存在一个样本数据集,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对 ...

  7. 【机器学习】K近邻算法——多分类问题

    给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该类输入实例分为这个类. KNN是通过测量不同特征值之间的距离进行分类.它的的思路是:如 ...

  8. 机器学习2—K近邻算法学习笔记

    Python3.6.3下修改代码中def classify0(inX,dataSet,labels,k)函数的classCount.iteritems()为classCount.items(),另外p ...

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

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

  10. 机器学习实战 - python3 学习笔记(一) - k近邻算法

    一. 使用k近邻算法改进约会网站的配对效果 k-近邻算法的一般流程: 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据.一般来讲,数据放在txt文本文件中,按照一定的格式进 ...

随机推荐

  1. careercup-C和C++

    13.1 用C++写个方法,打印输出文件的最后K行. 解答: 一种方法是打开文件两次,第一次计算文件的行数N,第二次打开文件,跳过N-K行, 然后开始输出.如果文件很大,这种方法的时间开销会非常大. ...

  2. mysql distinct跟group by性能

    mysql distinct和group by性能   1,测试前的准备 //准备一张测试表 mysql> CREATE TABLE `test_test` ( ->   `id` int ...

  3. 多台Linux服务器SSH相互访问无需密码--转

    一.环境配置 1.系统:CentOS release 5.6   IP:192.168.4.200   主机名:JW01 2.系统:CentOS release 5.9   IP:192.168.4. ...

  4. (转载)c语言指针学习

    前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...

  5. 【转】使用Beaglebone Black的I2C (二)——使用C语言和i2c-dev驱动

    在本博客的<使用Beaglebone Black的I2C(一)>中,介绍了BBB上无需编程对i2c总线进行读写操作的方法,本文将介绍如何在c语言程序中使用i2c-dev驱动来操作i2c设备 ...

  6. C# 之 OpenFileDialog的使用

    一.打开文件对话框(OpenFileDialog) 1. OpenFileDialog控件有以下基本属性 [1]InitialDirectory:对话框的初始目录 [2]Filter:要在对话框中显示 ...

  7. 基于动态库的C++插件开发模型

    基类为抽象类,在不同的动态库中实现不同的执行行为,但是每个动态库要提供2个统一的方法:1) baseClass * create(); 2) void destroy( baseClass* );,调 ...

  8. <item name="android:windowNoTitle">true</item> 不起作用。标题栏未被隐藏

    改变style.xml 加入 <item name="android:windowNoTitle">true</item> 按理说可以把标题栏隐藏,但是当s ...

  9. 关于SWT/JFace中其他常用的事件

    1.addSelectionListener:这个监听器最常用. 这个addSelectionListener是一个方法,addSelectionListener(SelectionListener ...

  10. Sublime Text3自动保存的功能(失去焦点自动保存)

    这是最新版本的Sublime Text3的设置方法 (三部曲); 第一步:preferences 下面的settings:(和老版本的不一样了吧,之前有什么default 和 users,这里只有se ...