网站规划与网页设计总结/百度收录快的发帖平台
因本人刚开始写博客,学识经验有限,如有不正之处望读者指正,不胜感激;也望借此平台留下学习笔记以温故而知新。这个系列是机器学习实战一书的学习笔记,主要是基本算法的代码实现。
机器学习实战 百度网盘链接:百度网盘-链接不存在
提取码: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))-dataSetsqDiffMat = diffMat**2sqDistances = sqDiffMat.sum(axis=1)distances = sqDistances**0.5sortedDistIndicies = distances.argsort()# 选择距离最小的k个点classCount={}for i in range(k):voteIlabel = labels[sortedDistIndicies[i]]classCount[voteIlabel] = classCount.get(voteIlabel,0)+1sortedClassCount = 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 = 0for line in arrayOLines:# 截取掉所有的回车字符line = line.strip()listFromLine = line.split('\t')returnMat[index,:] = listFromLine[0:3]classLabelVector.append(int(listFromLine[-1]))index += 1return 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 - minValsnormDataSet = 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.1datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')normMat,ranges,minVals = autoNorm(datingDataMat)m = normMat.shape[0]numTestVecs = int(m*hoRatio)errorCount = 0.0for 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+=1print('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 returnVectfrom 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 = 0mTest = 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 += 1print('\nthe total number of errors is:%d'%errorCount)print('\nthe total error rate is:%f'%(errorCount/float(mTest)))
主要步骤小结:
创建分类器,涉及到的相似性测量是欧氏距离
数据格式的转换,统一为分类器能够识别的数据格式表达
继续处理数据格式,主要是归一化处理
处理后的数据在分类器中进行测试,并根据错误率调整相关参数
满足错误率要求即可用调参结束的分类器对新数据进行预测