K-Nearest Neighbors的算法简介

211 阅读6分钟

KNN算法简介

在这篇文章中,我们将了解一种名为K-Nearest Neighbors(KNN)的监督式机器学习算法。这种算法可用于分类和预测等任务。

在本文结束时,你将获得对各种监督机器学习算法的概述,了解什么是KNN算法,它是如何工作的,还能学会从头开始构建该算法。作为先决条件,对机器学习和Python有一点了解会对初学者有所帮助。

监督学习

根据[维基百科],监督学习是一项机器学习任务,即根据输入-输出对的例子,学习一个将输入映射到输出的函数。它从由一组训练实例组成的标记训练数据中推断出一个函数。

用更简单的话来说,可以说我们是通过展示一些可能的预测或分类的样本(训练和测试)来教机器如何预测或分类。

我们使用带有特征和标签的训练数据,以使机器首先学习。之后,使用测试数据对其进行验证或测试。因此,这种学习方法被称为监督学习。

K-最近的邻居算法

K-Nearest Neighbors(KNN)算法就是这样一种监督学习方法,可用于分类和回归。

分类指的是预测性建模问题,即对输入数据的一个给定例子预测一个类别标签。例如,将动物分类为猫或狗,将电子邮件分类为垃圾邮件或非垃圾邮件。

在分类中,预测值是离散值,如01 ,它与truefalse 有关。也可以有多变量(多于一个标签)分类。

而回归是另一种类型的问题,需要对连续值进行预测。例如,如果我们想预测股票市场中股票的大致价值,我们将不得不使用回归。

在KNN算法中遵循的步骤。

  1. 加载训练和测试数据集。
  2. 指定或选择K 的值。
  3. 对测试数据上的每一个点进行以下操作。
  4. 计算该点与训练数据集的每个点之间的距离。我们可以使用欧氏距离或曼哈顿距离。
  5. 根据距离的远近,将这些值按升序排序。
  6. 从排序后的列表中找出前K值。
  7. 找到前K值的标签的频率(模式)。
  8. 将模式分配给测试数据点。
  9. 分配的值是特定测试数据点的分类或预测值。

KNN algorithm

现在,我们将学习如何从头开始建立上述步骤。

一步一步的指导

让我们来学习从头开始建立K-近邻算法。尽管我们使用某些库,如sklearn ,其中包含预定义的方法来使用KNN算法进行分类或预测;学习从头开始建立它将有助于我们更好、更有效地掌握概念。

目标

作为一个示范,我们将利用Diabetes 数据集,其中包含各种参数来分类一个人是否患有糖尿病。

下面是该数据集的截图。

Screenshot of the dataset

糖尿病数据集的屏幕截图

安装

为了从头开始建立KNN算法,你可以安装3.0以上的任何版本的Python。

在安装Python时,你必须安装以下库。

  • [Numpy]
  • [Pandas]
  • [操作员]
  • [统计学]

你可以用以下命令安装上述库。

  • Numpy使用pip install numpy
  • Pandas 使用pip install pandas.
  • 运算器使用pip install pyoperators
  • 统计学使用pip install statistics

导入库

设置好环境后,让我们开始编码吧!

首先,你要导入那些必要的库。

import pandas as pd
import numpy as np
import operator
from statistics import mode

读取数据集

现在,你必须导入数据集,并通过使用一个名为read_csv() 的函数来读取它。这个函数将CSV 文件作为参数,并返回一个数据框

#col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
data = pd.read_csv("diabetes.csv")

Dataset sample

数据集的前5行

建立实用函数

查找欧几里得距离

在KNN算法中,我们使用欧氏距离来寻找任何两点之间的距离。欧氏距离是任意两点之间差异的平方。

欧氏距离的公式是。

Euclidean distance

欧氏距离的计算公式

另外,我们还可以使用其他距离测量方法,如曼哈顿距离或绝对距离。

def euclidean_distance(x, y, length):
    # Dictionary to keep track of coordinate as key, with distance as the value
    sum_squared_distance = {}
    for i in range(len(x)):
        sum = 0
        sum += np.square(x[i][0] - y[0]) # Square of differnce in x-axis
        sum += np.square(x[i][1] - y[1]) # Square of differnce in y-axis
        sum_squared_distance[i] = np.sqrt(sum)
    return sum_squared_distance

根据值对字典进行排序

一个函数接受一个 dictionary 作为输入参数,并返回一个基于值的排序 dictionary。

一个 Python 字典包含一个 "键-值 "对。当我们对一个 dictionary 使用sort() 时,默认情况下,它被基于 "key "进行排序。

由于我们想根据 "值 "进行排序,我们将不得不使用一个自定义的排序方法,如下图。

# Sort the items in the dictionary of the calculated distances    
def sort_distance(distance):    
    sorted_d = sorted(distance.items(), key = operator.itemgetter(1))
    return sorted_d

这里,items() 函数返回一个包含 "键-值 "对的图元列表。而且,在这里我们使用key 来进行排序,作为 "键"。

查找前K值

在KNN中,K 值指定了用于分类或预测的最大近邻的数量。

在这里,我们必须找到顶级的K 值。

为了做到这一点,我们利用以下函数。

# Find the Top K classes from the sorted items
def top_k_dictionary(sorted_d):
    top_k = {}
    for i in range(k):
        top_k.update(sorted_d[:k])
    return top_k

这里,[:k] 是Python中使用的一个切片函数,它帮助我们从0 开始获取第一个k 值。这被用作[0:k] 的速记符号。

使用模式进行分类

在找到顶级的K 元素后,我们使用mode ,以找到可能的分类结果。模式是一种统计措施,它告诉我们一个特定值的最大出现次数。

# Find the mode of the Top K class and it is the prediction
def top_k_class(query, top_k, data_dict_train, data_dict_test):        
    final_top_k = []
    for i in top_k:
        final_top_k.append(data_dict_train[i][0])
    print(query," Prediction is ",data_dict_test[mode(final_top_k)])

上面的代码片段打印了查询的可能预测结果。

建立KNN函数

在建立了实用函数之后,现在我们必须利用它们来建立我们的实际函数来寻找K-Nearest Neighbors。

# Find the prediction of the query
def knn(data,query,k):
    distances = {}
    sort = {}
    length = 2
    data_dict_train = {} # Dictionary to hold train data
    data_dict_test = {} # Dictionary to hold test data
    for i in range(len(data)):
        data_dict_train[i] = data[i]
        data_dict_test[i] = y[i]
        
    distance = euclidean_distance(data, query, length) # returns a dictionary of euclidean distances
    sorted_d = sort_distance(distance) # returns a sorted dictionary based on value
    top_k = top_k_dictionary(sorted_d) # finds the top K elements
    top_k_class(query, top_k, data_dict_train, data_dict_test) # prediction function

构建主函数

现在,让我们建立一个main() 函数,通过传递所需的特征和标签以及一些样本查询来调用knn() 函数来演示分类。

# Pass the input and output lists    
def main():
    x = data[['Pregnancies','Glucose','BloodPressure','SkinThickness','Insulin','BMI','DiabetesPedigreeFunction','Age']].values # Features
    y = data.iloc[:,-1] # Labels
    k = 3 # Specifying the value of K

    query = [[0,100],[5,100]] # 2 possible test data query
    for i in query:
        knn(x, i, k)

if __name__=='__main__':
    main()

输出。

[0, 100]  Prediction is  1
[5, 100]  Prediction is  0

结论

我们了解了一种被称为K-Nearest Neighbors的监督学习算法。我们还从头开始建立了KNN算法。