一、基本概念
1.通过线性回归(参见第18章)可以学习一条曲线,作为一组实例的模型,然后使用这个模型对未知实例进行预测。基本范式
如下:
(1) 观察一组实例,通常称为训练数据,它们可以表示某种统计现象的不完整信息;
(2) 对观测到的实例进行扩展,并使用推断技术对扩展过程建模;
(3) 使用这个模型对未知实例进行预测。
2.机器学习的方法数不胜数,但所有方法都试图建立一个模型来对现有实例进行归纳。所有方
法都具有以下3个部分:
(1)模型的表示;
(2)用于评估模型优度的目标函数;
(3)一种优化方法,可以通过学习找出一个模型,使目标函数值最小化或最大化。
3.机器学习算法可以分为监督式学习方法和无监督式学习方法。
监督式学习中,我们先从一组成对的特征向量和值开始。目标是从这些特征向量和值中推导出某种规则,以预测与未知的特征向量所对应的值。回归模型为每个特征向量关联一个实数。分类模型为每个特征向量关联一组数量有限的标签。
在非监督式学习中,我们被给定一个没有标注的特征向量集合。非监督式学习的目标就是发现特征向量集合中的隐含模式。。一般来说,非监督式机器学习方法可以分为两种,一种是聚类方法,另一种是隐变量模型学习方法。
4.特征向量
特征工程的目的就是将现有数据中可以作为信号的特征与那些仅是噪声的特征区分开来。特征工程的失败会导致糟糕的模型。当数据的维度(即特征的数量)相对于样本量来说比较大时,特征工程就具有较高的失败风险。
成功的特征工程是一个抽象过程,它可以将大量的可用信息缩减为可以用于归纳的信息。
5.距离度量
曼哈顿距离:在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离”。曼哈顿距离也称为“城市街区距离”。
不同类型的特征有不同的取值范围。
6.分类方法
最常见的监督式学习应用就是建立分类模型。分类模型也称为分类器,用于对样本进行标注,标明这个样本属于一个有限的类别集合中的哪个类。
7.分类器
灵敏度(某些领域称为召回率)即真阳性率,也就是正确识别的阳性数量与实际阳性数量的比例。特异度(某些领域称为精确度)即真阴性率,也就是正确识别的阴性数量与实际阴性数量的比例。阳性预测值是一个被分类为阳性的样本确实是阳性的概率。阴性预测值是一个被分类为阴性的样本确实是阴性的概率。
8.KNN算法
KNN,即K近邻法(k-nearst neighbors),所谓的k最近邻,就是指最接近的k个邻居(数据),即每个样本都可以由它的K个邻居来表达。kNN算法的核心思想是,在一个含未知样本的空间,可以根据离这个样本最邻近的k个样本的数据类型来确定样本的数据类型。
在scikit-learn 中,与近邻法这一大类相关的类库都在sklearn.neighbors包之中。其中分类器有KNN分类树KNeighborsClassifier、限定半径最近邻分类树的类RadiusNeighborsClassifier以及最近质心分类算法NearestCentroid等等。
前两种分类算法中,scikit-learn实现两个不同的最近邻分类器:KNeighborsClassifier基于每个查询点的k个最近邻点实现学习,其中k是用户指定的最近邻数量。 RadiusNeighborsClassifier基于每个训练点的固定半径r内的最近邻搜索实现学习,其中r是用户指定的半径浮点值。
二、练习总结
1.辨别性别
import numpy as np
from math import sqrt
import operator as opt
def normData(dataSet):
maxVals = dataSet.max(axis=0)
minVals = dataSet.min(axis=0)
ranges = maxVals - minVals
retData = (dataSet - minVals) / ranges
return retData, ranges, minVals
def kNN(dataSet, labels, testData, k):
distSquareMat = (dataSet - testData) ** 2 # 计算差值的平方
distSquareSums = distSquareMat.sum(axis=1) # 求每一行的差值平方和
distances = distSquareSums ** 0.5 # 开根号,得出每个样本到测试点的距离
sortedIndices = distances.argsort() # 排序,得到排序后的下标
indices = sortedIndices[:k] # 取最小的k个
labelCount = {} # 存储每个label的出现次数
for i in indices:
label = labels[i]
labelCount[label] = labelCount.get(label, 0) + 1 # 次数加一
sortedCount = sorted(labelCount.items(), key=opt.itemgetter(1), reverse=True) # 对label出现的次数从大到小进行排序
return sortedCount[0][0] # 返回出现次数最大的label
if name == "main":
dataSet = np.array([[2, 3], [6, 8]])
normDataSet, ranges, minVals = normData(dataSet)
labels = ['a', 'b']
testData = np.array([3.9, 5.5])
normTestData = (testData - minVals) / ranges
result = kNN(normDataSet, labels, normTestData, 1)
print(result)
2.错题