机器学习(五)
3.1 KNN算法
**
- KNN算法又称为最近邻算法,主要基于测量不同特征值之间的距离方法进行分类,KNN算法可以对数据进行分类和回归处理。
**
3.2 KNN算法核心三要素
**
- 距离度量
- k取值
- 分类规则
**
3.2.1 邻近度度量
考虑的是两个点之间的距离,越相似,代表两个点距离越近。
1. 单个属性的度量
采用相似度度量,相似度s在0和1 之间取值,0代表不相似,1代表完全相似。另外还可以用相异度度量,方法同理,有时也在0和∞之间取值。
2. 二元数据的相似性度量
两个仅包含二元属性的对象之间的相似性度量也称为相似系数,并且通常在0和1之间取值,方法同理。
3. 对于两个n维向量
如果是直接物理量,可以用欧式距离、曼哈顿距离、闵可夫斯基距离方法等计算两个n维向量之间的距离。
4.对于文本分类而言,一般可以采用余弦定理计算两个n维向量之间的夹角确定相似度
3.2.2 如何选择k值
**
- k值较小,相当于用较小邻域中的训练实例进行预测。
**
- 应用中,一般选择较小的k值并且k取奇数,通常采用交叉验证的方法选取最合适的k值。
3.2.3 分类决策规则
KNN算法可以进行回归和分类预测,处理过程类似,区别主要是决策规则不同。
- 做回归时:一般选择平均法,即最近的k个样本的样本输出的平均值作为回归预测值;
- 做分类预测时:通常采用多数表决法,即训练集里和预测的样本特征最近的k个样本,决策类别时,预测为有最多类别数的类别。
3.3 Python实现KNN算法
from numpy import *
import operator
# 定义创建数据集函数
def createDataSet():
# 数据存储到数组变量group中
group = array([[1.0, 2.0], [1.2, 0.1], [0.1, 1.4], [0.3, 3.5]])
# 定义标签变量
labels = ['A', 'A', 'B', 'B']
return group,labels
# 通过使用KNN算法进行分类
def classify(input,dataSet,label,k):
# 定义存储数据集数组第一维度的长度的变量
dataSize = dataSet.shape[0]
# 计算欧氏距离,tile(A,rep)的功能是重复A的各个维度
diff = tile(input,(dataSize,1)) - dataSet
sqdiff = diff ** 2
# 行向量分别相加,从而得到一个新的行向量
squareDist = sum(sqdiff,axis=1)
# 得到欧氏距离
dist = squareDist ** 0.5
# 对距离进行排序,argsort()根据元素的值排序,返回下标
sortedDistIndex = argsort(dist)
print(sortedDistIndex)
# 定义空字典
classCount={}
for i in range(k):
# 返回距离最近的k个点对应的标签值
voteLabel = label[sortedDistIndex[i]]
# 存放到字典当中
classCount[voteLabel] = classCount.get(voteLabel,0)+1
maxCount = 0
for key,value in classCount.items():
if value > maxCount:
maxCount = value
classes = key
return classes
编写测试程序,验证一下效果:
import KNN
from numpy import *
dataSet,labels = KNN.createDataSet()
input = array([1.1,0.3])
k = 3
output = KNN.classify(input,dataSet,labels,k)
print("测试数据为:",input,"分类结果为:",output)