机器学习实战读书笔记-第一章k-近邻算法

才开始看机器学习实战这本书,确实有些晚了,还只能在碎片时间来看,不过确实非常有用
接下来按照书上的例子实际操作了一遍,源代码和数据在书前面的链接里就能找到
我用的python3+win8.1
第一章 k-近邻算法
1.工作原理是:存在一个样本数
据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据
与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的
特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们
只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。
最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
2.准备:使用 Python 导入数据
代码和结果如下所示
from numpy import *
import matplotlib
import matplotlib.pyplot as plt
import operator
from os import listdir
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
lables = ['A','A','B','B']
return group,lables
机器学习实战读书笔记-第一章k-近邻算法
机器学习实战读书笔记-第一章k-近邻算法
3 实施 kNN 算法
classify0() 函数有4个输入参数:用于分类的输入向量是inX,输入的训练样本集为dataSet,
标签向量为 labels ,最后的参数 k 表示用于选择最近邻居的数目,其中标签向量的元素数目和矩
阵 dataSet 的行数相同。使用欧氏距离公式,计算两个向量点xA和xB之间的距离 :
机器学习实战读书笔记-第一章k-近邻算法
机器学习实战读书笔记-第一章k-近邻算法
def classify0(inX,dataSet,labels,k):
dataSetSize=dataSet.shape[0]
diffMat =tile(inX,(dataSetSize,1)) - dataSet #距离计算
sqDiffMat = diffMat**2
sqdistances = sqDiffMat.sum(axis=1)
distances = sqdistances**0.5
sortedDistIndicies= distances.argsort() #
classCount={}
for i in range(k): #选择距离最小的k个点
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
sortedClassCount = sorted(classCount.items(),
key=operator.itemgetter(1),reverse=True) #排序
return sortedClassCount[0][0]
机器学习实战读书笔记-第一章k-近邻算法
机器学习实战读书笔记-第一章k-近邻算法
4.示例:使用 k-近邻算法改进约会网站的配对效果
准备数据:从文本文件中解析数据
文件名称应该是'datingTestSet2.txt'
def file2matrix(filename):
fr = open(filename)
numberOfLines = len(fr.readlines()) #得到文件的行数

returnMat = zeros((numberOfLines,3)) #创建返回的NumPy矩阵
classLabelVector = []
fr = open(filename)
index = 0
for line in fr.readlines(): #解析文件数据到列表
line =line.strip();
listFromLine = line.split('\t')
returnMat[index, :] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index += 1
return returnMat,classLabelVector
机器学习实战读书笔记-第一章k-近邻算法
机器学习实战读书笔记-第一章k-近邻算法
5分析数据:使用 Matplotlib 创建散点图
datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
print(datingDataMat)
print(datingLabels)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:, 1], datingDataMat[:, 2],15.0*array(datingLabels),
#ax.scatter(datingDataMat[:, 0], datingDataMat[:, 1],15.0*array(datingLabels), 15.0*array(datingLabels))
plt.show()
列2和列3的效果
机器学习实战读书笔记-第一章k-近邻算法
机器学习实战读书笔记-第一章k-近邻算法
列1和列2的效果
机器学习实战读书笔记-第一章k-近邻算法
机器学习实战读书笔记-第一章k-近邻算法
6准备数据:归一化数值
#归一化特征值
def autoNorm(dataSet):
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
normDataSet = zeros(shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet - tile(minVals, (m, 1))
normDataSet = normDataSet/tile(ranges, (m, 1))
return normDataSet,ranges,minVals
机器学习实战读书笔记-第一章k-近邻算法
机器学习实战读书笔记-第一章k-近邻算法
7 测试算法:作为完整程序验证分类器
#测试分类器效果
def datingClassTest():
hoRatio = 0.10
datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
normMat,ranges,minVals = autoNorm(datingDataMat)
m = normMat.shape[0]
numTestVecs = int(m*hoRatio)
errorCount = 0.0
for i in range(numTestVecs):
classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],\
datingLabels[numTestVecs:m],3)
print("the classifier came back with : %d,the real answer is : %d"\
% (classifierResult,datingLabels[i]))
if (classifierResult != datingLabels[i]) : errorCount += 1.0
print("the total error rate is :%f" % (errorCount/float(numTestVecs)))
#预测函数
def classifyPerson():
resultList = ['not at all','in small doses','in large doses']
percentTats = float(input(\
"percentage of time spent playing video games?"))
ffMiles = float(input("frequent flier miles earned per year?"))
iceCream = float(input("liter of ice cream consumed per year?"))
datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
normMat,ranges,minVals = autoNorm(datingDataMat)
inArr = array([ffMiles,percentTats,iceCream])
classifierResult = classify0((inArr-\
minVals)/ranges,normMat,datingLabels,3)
print("you will probably like this Person:",\
resultList[classifierResult - 1])
机器学习实战读书笔记-第一章k-近邻算法
机器学习实战读书笔记-第一章k-近邻算法
数字识别的实例类似就不说了。