机器学习(1):K-近邻算法
自己最近在学习机器学习方面的知识,记录一下自己的学习过程。最要针对代码中的思路,函数进行一些学习分析,达到自己学习的目的。
1.k-近邻算法:采用测量不同特征值之间的距离方法进行分类。
2.优缺点
优点:精度高,对异常值不敏感,无数据输入假定。
缺点:计算复杂度高,空间复杂度高
适用数据范围:数值型个标称型
3.所需计算公式:欧氏距离
4.KNN分类算法
- 计算数据集中点与当前点的距离。
- 按照距离进行递增次序排序。
- 选取距离最近的K个点
- 统计k个点中每种情况出现的频率
- 确定k个点中出现频率最高的类别,作为分类
import operator
from numpy import *
from numpy import tile, zeros, array
def createData():
group = array([
[1., 1.1],
[1., 1.],
[0., 0.],
[0., 0.1],
])
label = ['A', 'A', 'B', 'B']
return group, label
def classify0(inX, dataset, labels, k):
"""
k临近算法
:param inX:
:param dataset:
:param labels:
:param k:
:return:
"""
# 获得数据集的个数
datasetSize = dataset.shape[0]
# 计算 目标点 和数据集之间各点的距离
diffMat = tile(inX, (datasetSize, 1)) - dataset
sqDiffMat = diffMat**2
sqDistance = sqDiffMat.sum(axis=1)
distance = sqDistance**0.5
print("distance:", distance)
# 排序 返回排序的索引
sorteDistIndicies = distance.argsort()
print("sorteDistIndicies:", sorteDistIndicies)
# 找到k个最近的点,比较,选择最优解
classCount = {}
# 保存k个范围内 每种类别个数量 进行比较
for i in range(k):
# 通过下标找到对应的标签元素
voteIlabel = labels[sorteDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0)+1
print(f"classCount{i}", classCount)
# 通过第二个元素,逆序排序(大->小)
sortedClassCount = sorted(classCount.items(),
key=operator.itemgetter(1),
reverse= True)
print(sortedClassCount)
return sortedClassCount[0][0]
def autoNorm(dataSet):
"""
归一化,当元素过大时使用
"""
#选取每一列的最大最小值
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
# 计算范围值
ranges = maxVals - minVals
normDataSet = zeros(shape(dataSet))
m = dataSet.shape[0]
#当前值与最小值的差
normDataSet = dataSet - tile(minVals,(m, 1))
#相除,归一
normDataSet = normDataSet/tile(ranges, (m, 1))
return normDataSet, ranges, minVals
if __name__ == '__main__':
data, label = createData()
print(classify0([1, 1], data, label, 3))
5.总结
总体来说k-近邻算法思路较为简洁,便于理解。但在使用算法时需要有接近实际的训练样本数据。k-近邻算法必须保存全部的数据集,数据量过大时需要使用大量的存储空间。计算耗时。