机器学习——KNN算法

KNN算法(机器学习的分类算法)基本思想:

一个样本与数据集中的k个样本最相似,如果这k个样本大多数属于某一类,则该样本也属于这一类

通俗的说,即一个样本可以用离它最近的K个邻居来代表,是机器学习中最简单的分类算法

KNN算法距离计算:

使用欧氏距离计算方法,以二维平面为例,欧氏距离计算公式如下:

二维空间欧式距离

 拓展到多维空间:

多维空间欧式距离

 KNN算法特点:

KNN算法不需要训练数据,只需要存储大量数据并在分析样本时拿出来作对比

并且相对于有预测的回归模型,KNN不需要对数据进行任何的预测,只需要获得大量训练数据并在分析数据时拿来用就行了

相对优势:

简单,数学基础低,预测效果好,对异常值不敏感

相对劣势:

需要内存空间非常大用于存储训练数据

分析阶段需要大量时间进行对比和运算并存储

 

用游戏得分数据编写实例:

import math

import numpy
import operator

def createDataSet():
    playerdata ={1: [633, "黄金"],
                 2: [426, "黄金"],
                 3: [315, "白银"],
                 4: [422, "白银"],
                 5: [753, "白金"],
                 6: [862, "钻石"],
                 7: [456, "白银"],
                 8: [675, "白金"],
                 9: [1358, "大师"],
                 10: [985, "钻石"],
                 11: [765, "白金"],
                 12: [554, "黄金"],
                 13: [113, "青铜"],
                 14: [102, "青铜"],
                 15: [151, "青铜"],
                 }

    x = [233]
    KNN = []
    for key, v in playerdata.items():
        d = math.sqrt((x[0] - v[0]) ** 2 )
        KNN.append([key, round(d, 2)])

    KNN.sort(key=lambda dis: dis[1])
    print(KNN)
    KNN = KNN[:5]

    labels = {"青铜": 0, "白银": 0, "黄金": 0, "白金": 0, "钻石": 0, "大师": 0}
    for s in KNN:
           label = playerdata[s[0]]
           labels[label[1]] += 1
    labels = sorted(labels.items(), key=lambda l: l[1], reverse=True)
    print(labels, labels[0][0], sep='\n')

createDataSet()

解释:

输入样本

   playerdata ={1: [633, "黄金"],
                 2: [426, "黄金"],
                 3: [315, "白银"],
                 4: [422, "白银"],
                 5: [753, "白金"],
                 6: [862, "钻石"],
                 7: [456, "白银"],
                 8: [675, "白金"],
                 9: [1358, "大师"],
                 10: [985, "钻石"],
                 11: [765, "白金"],
                 12: [554, "黄金"],
                 13: [113, "青铜"],
                 14: [102, "青铜"],
                 15: [151, "青铜"],
                 }

 设置样本

 x = [233]

设置KNN算法距离计算公式并引入数组存储

KNN = []
    for key, v in playerdata.items():
        d = math.sqrt((x[0] - v[0]) ** 2 )
        KNN.append([key, round(d, 2)])

排序经过计算之后的距离数组并选取K=5

KNN.sort(key=lambda dis: dis[1])
    print(KNN)
    KNN = KNN[:5]

设置各段位数据,对5个最近的数据集进行匹配,输出匹配最多次的段位

labels = {"青铜": 0, "白银": 0, "黄金": 0, "白金": 0, "钻石": 0, "大师": 0}
    for s in KNN:
           label = playerdata[s[0]]
           labels[label[1]] += 1
    labels = sorted(labels.items(), key=lambda l: l[1], reverse=True)
    print(labels, labels[0][0], sep='\n')

结束

代码运行结果为

[[3, 82.0], [15, 82.0], [13, 120.0], [14, 131.0], [4, 189.0], [2, 193.0], [7, 223.0], [12, 321.0], [1, 400.0], [8, 442.0], [5, 520.0], [11, 532.0], [6, 629.0], [10, 752.0], [9, 1125.0]]

[('青铜', 3), ('白银', 2), ('黄金', 0), ('白金', 0), ('钻石', 0), ('大师', 0)]

青铜

你可能感兴趣的:(算法,机器学习)