kNN算法及其应用

kNN算法是监督学习中的一个重要部分,它用于近似求解实际或离散值的目标函数。这种算法的特点是存储训练样本,并在测试样本输入时寻找最匹配的样本。kNN算法也被称为基于实例的学习或记忆基础学习。常见的实例基础学习算法包括kNN、RBF(径向基函数)网络和核机器。本文将讨论kNN算法及其实际实现。

kNN算法概述

kNN是一种监督学习算法,既可用于分类任务,也可用于回归任务。由于它在预测之前不做任何工作,直到确切知道需要预测的内容和变量类型,因此kNN常被称为懒惰学习算法。它是一个非常有效的交叉验证工具,对许多用户来说,这是一种易于理解的学习方法。kNN支持解释和训练,并且可以使用任何距离度量。

与基于记忆的学习相关的缺点包括维度的诅咒、运行时间成本随着训练集大小的增加而增加、大型训练集无法适应内存,以及在回归情况下预测值不连续。

kNN算法分类基础

1. 在训练阶段,算法保存训练样本。

2. 在预测阶段,算法在训练样本中找到与测试样本最接近的k个样本,然后预测这些样本中最常见的类别。

kNN算法背后的数学原理

欧几里得距离是用于计算的常用度量之一,它用于找出k个最近邻和进行预测。当属性的尺度和差异相似,且属性尺度相等范围或方差时,欧几里得距离给予所有属性相等的权重,并假设类别是球形的。

k值的重要性及选择

‘k’代表最近邻的数量。在上图中,可以看到一些圆形和一些正方形,它们是分类。星号是测试样本,它要么被归类为圆形,要么被归类为正方形。如果k=3,星号被分配给圆形,因为有两个圆形和一个正方形。在另一个例子中,如果k=5,星号被归类为正方形,因为有三个正方形和两个圆形。通过这种方式,kNN分类完成。‘k’的值需要仔细选择,太大和太小的k值的影响如下概述。

选择大k值

1. 对噪声不太敏感,尤其是噪声。

2. 对离散类别有更好的概率估计。

3. 较大的训练集允许较大的k值。

选择小k值

1. 更好地捕捉问题空间的细结构。

2. 在小型训练集中是必要的。

这个算法的一个重要方面是,随着训练集接近无穷大,k值增大,kNN变得最优。

kNN算法在工业中的应用

1.推荐系统- 亚马逊和Flipkart通过目标营销工具推荐产品,这些产品基于搜索历史和喜好,最有可能购买。

import numpy as np import pandas as pd import matplotlib.pyplot as plt # 导入numpy, pandas, 和matplotlib.pyplot包 df=pd.read_csv('heart.csv') df是数据框架,其中加载了‘heart’数据集。 df.head() df.shape df.info() df.describe().T df.isnull().sum() # 加载数据集后,使用head()函数读取数据集的前5行, # shape函数用于查找行数和列数,在这种情况下,它是303行和14列, # info()函数给提供了数据类型、列、空值计数、内存使用等信息。然后, # describe()函数被用来生成数据集的描述性统计。 T是用于转置df数据框架的索引和列。为了确保数据集是干净的,使用isnull()函数, 发现没有空值。让进一步编码 import seaborn as sns sns.pairplot(df,hue='target') 导入了基于matplotlib的数据可视化seaborn库,并创建了一个成对图。成对图有助于创建联合关系的散点图和单变量分布的直方图。让进一步分析数据集 plt.figure(figsize=(14,12)) sns.heatmap(df.corr(), annot=True,cmap ='RdYlGn') 为了找到两个量之间的关系,使用了皮尔逊相关系数,这也将测量两个变量之间的关联强度。此外,使用了热图来生成信息的二维表示,使用颜色。现在,来到建模数据的重要部分,这将给预测的力量。 from sklearn.preprocessing import StandardScaler X = pd.DataFrame(StandardScaler().fit_transform(df.drop(['target'],axis = 1)),     columns=['age', 'sex', 'cp', 'trestbps', 'chol','fbs', 'restecg', 'thalach','exang','oldpeak','slope','ca','thal']) X.head() # 导入了scikit-learn机器学习库软件中的standard scaler。缩放数据对于kNN很重要, # 因为将所有特征带到同一尺度上是推荐的应用基于距离的算法。 X = df.drop('target',axis=1).values y = df['target'].values from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.35,random_state=5) from sklearn.neighbors import KNeighborsClassifier neighbors = np.arange(1,14) train_accuracy =np.empty(len(neighbors)) test_accuracy = np.empty(len(neighbors)) for i,k in enumerate(neighbors):     knn = KNeighborsClassifier(n_neighbors=k)     knn.fit(X_train, y_train)     train_accuracy[i] = knn.score(X_train, y_train)     test_accuracy[i] = knn.score(X_test, y_test) plt.title('k-NN Varying number of neighbors') plt.plot(neighbors, test_accuracy, label='Testing Accuracy') plt.plot(neighbors, train_accuracy, label='Training accuracy') plt.legend() plt.xlabel('Number of neighbors') plt.ylabel('Accuracy') plt.show() # 最初,为特征和目标创建了numpy数组。然后,从scikit-learn导入了train_test_split, # 将数据分成训练和测试数据集。创建了一个35%的测试大小。然后,使用k-最近邻算法创建了一个分类器。 # 然后,观察了不同k值的准确性,可以看到k=7时,测试准确性最高。 knn = KNeighborsClassifier(n_neighbors=7) knn.fit(X_train,y_train) knn.score(X_test,y_test) # 设置knn分类器为n_neighbor=7后,拟合了模型。然后,得到了70.09%的准确度分数。 from sklearn.metrics import confusion_matrix,accuracy_score y_pred = knn.predict(X_test) confusion_matrix(y_test,y_pred) # 混淆矩阵或错误矩阵是一个表格,它识别出真正的预测值,并被分类为真正的阳性、真正的阴性、假阳性和假阴性。 # 通过pandas的crosstab方法,它将更加清晰。 pd.crosstab(y_test, y_pred, rownames=['True'], colnames=['Predicted'], margins=True) # 在上述输出中,0表示没有心脏病,1表示有心脏病。37个受试者是0~0意味着真正的阴性;38个受试者是1~1意味着真正的阳性; # 13个受试者是0~1意味着假阳性,19个受试者是1~0意味着假阴性。这意味着在107个样本中,有75个被正确分类,其余的被错误分类。让得到完整的分类报告 from sklearn.metrics import classification_report print(classification_report(y_test,y_pred))
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485