K-最近邻复杂度

数据挖掘 机器学习 scikit-学习
2021-10-10 13:12:27

为什么 KNearest Neighbors 的复杂度会随着 k 值的降低而增加?k最近邻的图何时具有平滑或复杂的决策边界?请详细说明。

而且,给定一个要分类的数据实例,K-NN 是使用输入特征的统计模型计算每个可能类的概率,还是只得到支持它的点数最多的类?

1个回答

这种情况下的复杂性是讨论不同类之间边界的平滑度。理解这种平滑复杂性的一种方法是询问如果您稍微移动,您被分类的可能性有多大。如果这种可能性很高,那么您就有一个复杂的决策边界。

为了 k-NN算法决策边界基于选择的值 k,因为这就是我们将如何确定新实例的类别。当你减少价值k 你最终会做出更细化的决定,因此不同类之间的边界将变得更加复杂。

你应该注意到这个决策边界也高度依赖于你的类的分布。

让我们看看改变值时决策边界是如何变化的 k以下。我们可以看到,为k=20然而k=1在另一个区域有蓝色和红色的口袋,据说这比平滑的决策边界更复杂。


首先让我们用 100 个实例和 3 个类制作一些人工数据。

from sklearn.datasets.samples_generator import make_blobs
X, y = make_blobs(n_samples=100, centers=3, n_features=2, cluster_std=5)

让我们绘制这些数据,看看我们要面对什么

在此处输入图像描述

现在让我们看看边界对于不同的值是怎样的k. 我将在下面发布我用于此的代码供您参考。

k= 1

在此处输入图像描述

k= 5

在此处输入图像描述

k= 10

在此处输入图像描述

k= 20

在此处输入图像描述


代码

用于这些实验的代码如下取自这里

from sklearn import neighbors

k = 1
clf = neighbors.KNeighborsClassifier(20)
clf.fit(X, y)

from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt

cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])

# Plot the decision boundary. For that, we will assign a color to each
# point in the mesh [x_min, x_max]x[y_min, y_max].
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)

# Plot also the training points
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.show()