K-近邻算法-1

定义:采用测量不同特征值之间的距离方法进行分类

优点:精度高,对异常值不敏感,无数据输入的限定

缺点:计算复杂度与空间复杂度都相对较高

试用数据范围:数值型和标称型

                                      何为标称:标称型目标变量的结果只在有限目标集合中取值,如真与假。*(离散)

工作原理:存在一个样本数据集合(训练样本集),并且样本集这种每个数据都存在标签,即我们知道样本集中每一个数据与所述分类的对应关系,输入没有分类的标签数据后,将新数据的每个特征与样本集中数据对应的特征进行比较。然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,通常k是不大于20的整数。最后再选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

代码篇:

kNN.py

from numpy import *
import operator


# operator是运算符模块


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 classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]  # .shape 为矩阵的长度 在4×2的矩阵c, c.shape[1] 为第一维的长度,c.shape[0] 为第二维的长度。
    """tile(A,reps)字面意思:将A矩阵(其他数据类型)重复reps次 
    例如tile((1,2,3),3)==>array([1, 2, 3, 1, 2, 3, 1, 2, 3])
     如果是b=[1,3,5]
        tile(b,[2,3])
        array([[1, 3, 5, 1, 3, 5, 1, 3, 5],
       [1, 3, 5, 1, 3, 5, 1, 3, 5]]) 2指的是重复后矩阵的行数,而3指的是重复次数
        就如这里一样
    """
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet  # title([0,0],(4,1)) ==>[[0 0],[0 0],[0 0],[0 0]]
    sqDiffMat = diffMat ** 2  # 计算距离
    """
    平时用的sum应该是默认的axis=0 就是普通的相加 
    axis=1以后就是将一个矩阵的每一行向量相加
    """
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances ** 0.5
    sortDistIndicies = distances.argsort()
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1

    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)

    return sortedClassCount[0][0]

main.py

import kNN
from numpy import *

group, labels = kNN.createDataSet()
print(kNN.classify0([1, 1], group, labels, 3))
# 测试tile
# print(tile([0, 0], (4, 1)))
# 测试sum
# a = array([[0, 1, 2], [3, 4, 5]])
# a=mat(a)
# print(a.sum(axis=1))
# 测试shape
# e = eye(4)
# print(e)
# print(e.shape[1])

猜你喜欢

转载自blog.csdn.net/Toky_min/article/details/81872843