因本人刚开始写博客,学识经验有限,如有不正之处望读者指正,不胜感激;也望借此平台留下学习笔记以温故而知新。这个系列是机器学习实战一书的学习笔记,主要是基本算法的代码实现。
机器学习实战 百度网盘链接:百度网盘-链接不存在
提取码:qcht
推荐指数:5颗星
机器学习基础
表1-2列出了机器学习的主要任务,以及解决相应问题的算法。
开发机器学习应用程序的步骤:
(1) 收集数据。
(2) 准备输入数据。
(3) 分析输入数据。
(4) 训练算法。
(5) 测试算法。
(6) 使用算法。
Numpy矩阵与数组的区别
k-近邻算法
k-近邻算法(kNN)的工作原理
存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。
通常k是不大于20的整数。
问题描述:
使用k-近邻算法改进约会网站的配对效果
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 26 14:48:43 2019
@author: yuxi
"""
import numpy as np
import operator
# 简单的数据划分类别
def creatDataSet():
group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group,labels
# 用于分类的输入,训练样本,标签,数目k
def classify0(inX,dataSet,labels,k):
dataSetSize = dataSet.shape[0]
# 平铺相同维度的输入以供向量相减
diffMat = np.tile(inX,(dataSetSize,1))-dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort()
# 选择距离最小的k个点
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
sortedClassCount = sorted(classCount.items(),
key = operator.itemgetter(1),
reverse=True)
print(sortedClassCount[0][0])
return sortedClassCount[0][0]
'''
group,labels = creatDataSet()
classify0([0,0],group,labels,3)
'''
# 根据约会对象特征判定类型
# 首先进行数据格式的转换
def file2matrix(filename):
fr = open(filename)
# d得到文件行数
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 += 1
return returnMat,classLabelVector
'''
datamat, labels = file2matrix('datingTestSet2.txt')
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
''ax.scatter(datamat[:,1],datamat[:,2])''
# 用颜色和其他记号标记不同的样本分类
ax.scatter(datamat[:,0],datamat[:,1],15*np.array
(labels),15*np.array(labels))
plt.show()
'''
# 进行归一化处理
def autoNorm(dataSet):
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
normDataSet = np.zeros(np.shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet-np.tile(minVals,(m,1))
normDataSet = normDataSet/np.tile(ranges,(m,1))
return normDataSet, ranges, minVals
# 测试分类器的效果函数
def datingClassTest():
hoRatio = 0.1
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 result is: %d, and the real one is: %d'''%(classifierResult,datingLabels[i]))
if classifierResult!=datingLabels[i]:
errorCount+=1
print('the total error ratio is: %f' % (errorCount/float(numTestVecs)))
# 经过测试集测试后,接下来进行新数据的预测工作
def classifyPerson():
resultList = ['not at all','in small does','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('liters of ice cream consumed per year?'))
datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
normMat,ranges,minVals=autoNorm(datingDataMat)
inArr = np.array([ffMiles,percentTats,iceCream])
classifierResult = classify0((inArr-minVals)/ranges,
normMat,datingLabels,3)
print('you may be like this person:',resultList[classifierResult-1])
承上使用k-近邻算法进行手写数字识别的示例
# 使用KNN算法的手写识别系统
# 为了使用上述分类器进行分类,要将图像格式转换为函数相应的要求格式
def img2vector(filename):
returnVect = np.zeros((1,1024))
fr = open(filename)
for i in range(32):
# readline 和 readlines 的区别就在于复数形式上
lineStr = fr.readline()
for j in range(32):
returnVect[0,32*i+j]=int(lineStr[j])
return returnVect
from os import listdir
def handwritingClassTest():
hwLabels = []
# 读取目录文件
trainingFileList = listdir('trainingDigits')
m= len(trainingFileList)
trainingMat = np.zeros((m,1024))
for i in range(m):
# 从文件名进行分类数字的解析与格式转换
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
hwLabels.append(classNumStr)
trainingMat[i,:]=img2vector('trainingDigits/%s'%
fileNameStr)
testFileList = listdir('testDigits')
errorCount = 0
mTest = len(testFileList)
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
vectorUnderTest = img2vector('testDigits/%s'%
fileNameStr)
classifierResult = classify0(vectorUnderTest,
trainingMat,hwLabels,3)
print('the classifer came bace with:%d,the real one is:%d'%(classifierResult,classNumStr))
if classifierResult!=classNumStr:
errorCount += 1
print('\nthe total number of errors is:%d'%errorCount)
print('\nthe total error rate is:%f'%(errorCount/float(mTest)))
主要步骤小结:
创建分类器,涉及到的相似性测量是欧氏距离
数据格式的转换,统一为分类器能够识别的数据格式表达
继续处理数据格式,主要是归一化处理
处理后的数据在分类器中进行测试,并根据错误率调整相关参数
满足错误率要求即可用调参结束的分类器对新数据进行预测