仅作记录,供自己日后翻阅和理解。
监督学习一般使用两种类型的目标变量:标称和数值型
标称型目标变量的结果只在有限目标集中取值(分类)
数值型目标变量可以从无限的数值集合中取值(主要用于回归)
第二章 K-近邻算法(KNN)
2.1 算法概述
简单地说,采用测量不同特征值之间的距离方法进行分类。
工作原理:存在一个样本数据集(训练样本集),并且样本集中每个数据都存在标签。输入没标签的新数据后,将新数据地每个特征与样本集中数据对应的特征进行比较,然后算法提取样本中特征最相似数据(最邻近)的分类标签。一般只取样本数据集中前k个最相似的数据(k一般不大于20)
步骤:收集数据——>准备数据——>分析数据——>测试算法——>使用算法
扫描二维码关注公众号,回复:
1739317 查看本文章
from numpy import * #导入科学计算包 import operator #运算符模块 import matplotlib import matplotlib.pyplot as plt #解决显示中文问题 #coding:utf-8 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 def createDataSet(): group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels=['A','A','B','B'] return group,labels def test1(): group,label=createDataSet() print(group) print(label) fig = plt.figure() ax = fig.add_subplot(111) ax.set_title("带四个数据点的简单例子") ax.scatter(group[:,0], group[:, 1])
KNN伪代码:
1)计算已知类别数据集中的点和当前点之间的距离
2)按照距离递增次序排序
3)选取与当前点距离最小的k个点
4)确定前k个点所在类别的出现频率
5)返回前k个点出现频率最高的类别作为当前点的预测分类
from numpy import * #导入科学计算包 import operator #运算符模块 import matplotlib import matplotlib.pyplot as plt #解决显示中文问题 #coding:utf-8 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 def createDataSet(): group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) labels=['A','A','B','B'] return group,labels # k-j近邻算法 def classify0(inX, dataSet, labels, k): # inX是用于分类的输入向量;dataSet是输入的训练样本集,labels是标签向量,k是用于选择最近邻居的数目 #1 使用欧式距离,计算向量点之间的距离 dataSetSize = dataSet.shape[0] # 返回多维数组维度的第一维 diffMat = tile(inX, (dataSetSize,1)) - dataSet # title(x,(m,n))以x为基本单位生成一个m行,每行为n个x的多维数组 sqDiffMat = diffMat**2 # 平方 sqDistances = sqDiffMat.sum(axis=1) # 对数组按行求和 distances = sqDistances**0.5 # 开方 #1 计算距离结束 sortedDistIndicies = distances.argsort() # 按列排序,返回行标 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) # 使用itemgetter,按照第二个元素的次序对元组进行排序 return sortedClassCount[0][0] def test2(): group, label = createDataSet() print(classify0([0.9,0.9],group,label,3)) test2()
2.2 示例:使用算法改进约会网站的配对效果
1 准备数据:从文本文件中解析数据
2 分析数据:使用Matplotlib创建散点图
3 准备数据:归一化数值
4 测试算法:作为完整程序验证分类器
5 使用算法:构建完整可用系统
待续……