机器学习实战中的KNN算法

"""
k-近邻算法采用不同特征值之间的距离方法进行分类
优点:精度高,对异常值不敏感,无数据输入假定
缺点:计算复杂度高,空间复杂度高
适用数据范围:数值型与标称型
工作原理:存在一个数据集合,也称作训练数据集,并且样本集中每个数据都有标签,即我们知道样本集中每一数据与
所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法
提取样本集中特征最相似数据(最近邻)的分类标签。一般来书,我们只选择样本数据集中前k个最相似的数据,这就
是最近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据
的分类。

"""
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

"""
KNN算法伪代码
1)计算已知类别数据集中的点与当前点之间的距离
2)按照距离递增顺序排序
3)选取与当前点距离最小的K个点
4)确定前K个点所在类别的出现频率
5)返回前K个点出现频率最高的类别作为当前点的预测类别
"""
def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]  # shape:几行几列(元组) ,这里指数据的行数
    # np.tile:inX在列方向上重复1次,行向量上重复dataSetSize    diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
    sqDiffMat = diffMat ** 2
    sqDistance = sqDiffMat.sum(axis=1)
    distance = sqDistance ** 0.5
    # argsort: 用来返回数组值从小到大索引值(先排序,然后找其在原数组中的索引值)
    sortedDistIndicies = distance.argsort()
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        #dict.get(key, default=None)  返回指定键的值,如果指定键不存在,返回默认值None
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 # A或者B出现的次数进行技数
    sortedClassCount = sorted(classCount.items(), key= operator.itemgetter(1), reverse= True)
    return sortedClassCount[0][0]
group, labels = creatDataSet()
a = classify0([0, 0], group, labels, 3)

print(a) # B

下面对程序中一些部分进行细致的学习

numpy.tile()

"""
numpy.tile(A, (x,y))
A: array_alike
x: A来说,在行方向上重复X
y: A来说,在列方向上重复y
"""
import numpy as np
arr = [1,2,3]
arr1 = np.tile(arr, 2)  # 如果只有一个的话,默认为列方向的
arr2 = np.tile(arr, (2, 3))
print('arr1: ',arr1)  # [1 2 3 1 2 3]
print('arr2: ',arr2)  # n [[1 2 3 1 2 3 1 2 3] [1 2 3 1 2 3 1 2 3]]

argsort()

"""
argsort: 用来返回数组值从小到大索引值(先排序,然后找其在原数组中的索引值)
"""
import numpy as np
a = np.array([2, 6, 1, 5])
b = a.argsort() # a.sort() -->  1,2,5,6
print(a) #[[2,6,1,5]]
print(b) #[2,0,3,1]

sort()

 
 
"""
排序有两种:
1sort,在本地进行排序,不返回副本
2sorted,返回副本,原始输入不变
sorted(iterable,cmp=None,key=None,reverse=False)
iterable:可迭代类型
cmp:用于比较的函数,比较什么由key决定
key:用列表元素的某个属性或者函数作为关键字,有默认值,迭代集合中的一项
reverse:排序规则
"""
#  sortedClassCount = sorted(classCount.items(), key= operator.itemgetter(1), reverse= True)
#  operator.itemgetterx) 获取对象x个域的值
import operator
a = [1,2,3]
b = operator.itemgetter(1)
print(a) #[1,2,3]
print(b) # operator.itemgetter(1)
print(b(a)) # 2

猜你喜欢

转载自blog.csdn.net/niuxiaolei/article/details/80426968