KNN算法简介
在这篇文章中,我们将了解一种名为K-Nearest Neighbors(KNN)的监督式机器学习算法。这种算法可用于分类和预测等任务。
在本文结束时,你将获得对各种监督机器学习算法的概述,了解什么是KNN算法,它是如何工作的,还能学会从头开始构建该算法。作为先决条件,对机器学习和Python有一点了解会对初学者有所帮助。
监督学习
根据[维基百科],监督学习是一项机器学习任务,即根据输入-输出对的例子,学习一个将输入映射到输出的函数。它从由一组训练实例组成的标记训练数据中推断出一个函数。
用更简单的话来说,可以说我们是通过展示一些可能的预测或分类的样本(训练和测试)来教机器如何预测或分类。
我们使用带有特征和标签的训练数据,以使机器首先学习。之后,使用测试数据对其进行验证或测试。因此,这种学习方法被称为监督学习。
K-最近的邻居算法
K-Nearest Neighbors(KNN)算法就是这样一种监督学习方法,可用于分类和回归。
分类指的是预测性建模问题,即对输入数据的一个给定例子预测一个类别标签。例如,将动物分类为猫或狗,将电子邮件分类为垃圾邮件或非垃圾邮件。
在分类中,预测值是离散值,如0 或1 ,它与true 或false 有关。也可以有多变量(多于一个标签)分类。
而回归是另一种类型的问题,需要对连续值进行预测。例如,如果我们想预测股票市场中股票的大致价值,我们将不得不使用回归。
在KNN算法中遵循的步骤。
- 加载训练和测试数据集。
- 指定或选择
K的值。 - 对测试数据上的每一个点进行以下操作。
- 计算该点与训练数据集的每个点之间的距离。我们可以使用欧氏距离或曼哈顿距离。
- 根据距离的远近,将这些值按升序排序。
- 从排序后的列表中找出前K值。
- 找到前K值的标签的频率(模式)。
- 将模式分配给测试数据点。
- 分配的值是特定测试数据点的分类或预测值。

现在,我们将学习如何从头开始建立上述步骤。
一步一步的指导
让我们来学习从头开始建立K-近邻算法。尽管我们使用某些库,如sklearn ,其中包含预定义的方法来使用KNN算法进行分类或预测;学习从头开始建立它将有助于我们更好、更有效地掌握概念。
目标
作为一个示范,我们将利用Diabetes 数据集,其中包含各种参数来分类一个人是否患有糖尿病。
下面是该数据集的截图。
糖尿病数据集的屏幕截图
安装
为了从头开始建立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")
数据集的前5行
建立实用函数
查找欧几里得距离
在KNN算法中,我们使用欧氏距离来寻找任何两点之间的距离。欧氏距离是任意两点之间差异的平方。
欧氏距离的公式是。
欧氏距离的计算公式
另外,我们还可以使用其他距离测量方法,如曼哈顿距离或绝对距离。
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算法。