翼度科技»论坛 编程开发 python 查看内容

【scikit-learn基础】--『监督学习』之 K-近邻分类

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
KNN(K-近邻),全称K-Nearest Neighbors,是一种常用的分类算法
KNN算法的历史可以追溯到1957年,当时Cover和Hart提出了“最近邻分类”的概念。
但是,这个算法真正得到广泛认知和应用是在1992年,由Altman发表的一篇名为“K-Nearest Neighbors”的文章。
近年来,随着大数据和机器学习的快速发展,KNN算法因其简单且表现优秀,被广泛应用于各种数据分类问题中。
1. 算法概述

KNN算法的基本原理是:在特征空间中,如果一个样本的最接近的k个邻居中大多数属于某一个类别,则该样本也属于这个类别。
换句话说,KNN算法假设类别是由其邻居决定的。
那么,KNN算法判断数据是否相似是关键,也就是数据之间的距离是如何计算的呢?
最常用的距离计算公式有:

  • 曼哈顿距离:\(L_1(x_i,x_j)= \sum_{l=1}^{n} |x_i^{(l)}-x_j^{(l)}|\)
  • 欧氏距离:\(L_2(x_i,x_j) = (\sum_{l=1}^{n} \; |x_i^{(l)}-x_j^{(l)}|^{2})^{\frac{1}{2}}\)
  • 闵可夫斯基距离:\(L_p(x_i,x_j) = (\sum_{l=1}^{n} \; |x_i^{(l)}-x_j^{(l)}|^{2})^{\frac{1}{p}}\)
  • 等等
使用不同的距离,就会得到不同的分类效果。
2. 创建样本数据

这次用scikit-learn中的样本生成器make_classification来生成分类用的样本数据。
  1. import matplotlib.pyplot as plt
  2. from sklearn.datasets import make_classification
  3. # 分类数据的样本生成器
  4. X, y = make_classification(n_samples=1000, n_classes=4, n_clusters_per_class=1)
  5. plt.scatter(X[:, 0], X[:, 1], marker="o", c=y, s=25)
  6. plt.show()
复制代码

关于样本生成器的详细内容,请参考:TODO
3. 模型训练

首先,分割训练集测试集
  1. from sklearn.model_selection import train_test_split
  2. # 分割训练集和测试集
  3. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
复制代码
这次按照8:2的比例来划分训练集和测试集。
然后用scikit-learn中的KNeighborsClassifier模型来训练:
  1. from sklearn.neighbors import KNeighborsClassifier
  2. # 定义KNN模型(设置4个分类,因为样本数据是4个分类)
  3. reg = KNeighborsClassifier(n_neighbors=4)
  4. # 训练模型
  5. reg.fit(X_train, y_train)
  6. # 在测试集上进行预测
  7. y_pred = reg.predict(X_test)
复制代码
KNeighborsClassifier的主要参数包括:
<ol>n_neighbors:这是kNN算法中的k值,即选择最近的k个点。默认值为5。
weights:此参数默认为'uniform',也可以设置为'distance',或者用户自定义的函数。其中,'uniform'表示所有的邻近点的权重都是相等的,'distance'表示距离近的点比距离远的点的影响大。
algorithm:此参数默认为'auto',也可以设置为'auto','ball_tree','kd_tree',或'brute'。这决定了在计算最近邻时使用的算法。
leaf_size:此参数默认为30,也可以设置为一个整数,用于指定传递给构建叶子节点时使用的最小样本数。
p:此参数默认为2,也可以设置为一个值

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
来自手机

举报 回复 使用道具