如何从k最近邻预测中提取边界值 [英] How to extract the boundary values from k-nearest neighbors predict

查看:137
本文介绍了如何从k最近邻预测中提取边界值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  • 对于
  • How can only the boundary values be extracted, or returned, from .predict, for sklearn.neighbors.KNeighborsClassifier()?
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

# prepare data
iris = load_iris()
X = iris.data
y = iris.target
df = pd.DataFrame(X, columns=iris.feature_names)
df['label'] = y
species_map = dict(zip(range(3), iris.target_names))
df['species'] = df.label.map(species_map)
df = df.reindex(['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)', 'species', 'label'], axis=1)

# instantiate model
knn = KNeighborsClassifier(n_neighbors=6)

# predict for 'petal length (cm)' and 'petal width (cm)'
knn.fit(df.iloc[:, 2:4], df.label)

h = .02  # step size in the mesh

# create colormap for the contour plot
cmap_light = ListedColormap(list(sns.color_palette('pastel', n_colors=3)))

# 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 = df['petal length (cm)'].min() - 1, df['petal length (cm)'].max() + 1
y_min, y_max = df['petal width (cm)'].min() - 1, df['petal width (cm)'].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)

# create plot
fig, ax = plt.subplots()

# add data points
sns.scatterplot(data=df, x='petal length (cm)', y='petal width (cm)', hue='species', ax=ax, edgecolor='k')

# add decision boundary countour map
ax.contourf(xx, yy, Z, cmap=cmap_light, alpha=0.4)

# legend
lgd = plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')

plt.show()

结果图

  • 没有颜色或样式,只是具有决策边界和数据点.

  • scikit-learn: Nearest Neighbors Classification
  • scikit-learn: Plot the decision boundaries of a VotingClassifier
  • scikit-learn: Comparing Nearest Neighbors with and without Neighborhood Components Analysis
  • 使用Matplotlib的pyplot绘制分隔两个类的决策边界
    • 解决方案显示了如何在不填充图的情况下绘制决策边界,但是没有答案显示了如何提取决策边界值.
      • plt.contour(xx, yy, Z, cmap=plt.cm.Paired)
      • Plotting a decision boundary separating 2 classes using Matplotlib's pyplot
        • This solution shows how to plot the decision boundary without filling the plot, but none of the answers show how to extract the decision boundary values.
          • plt.contour(xx, yy, Z, cmap=plt.cm.Paired)
          • 我提供了 a 解决方案,但是我不确定这是否是最好的解决方案.我当然愿意接受其他选择.
          • 也就是说,我不希望使用contourfpcolormesh图为彩色的解决方案.
          • 最好的解决方案是简洁地仅提取决策边界值.
          • I have provided a solution, but I'm not sure if it's the best solution. I'm certainly open to other options.
          • That said, I do not want a solution that is a colored in contourf, or pcolormesh plot.
          • The best solution would, succinctly, extract only the decision boundary values.

          推荐答案

          • 这是我想到的一种解决方案,它使用 np.diff 沿Z的两个轴,结果为.predict.这个想法是,只要结果发生变化,这就是决策边界.
            • 使用.diff从自身中减去Z,移位1.
            • 使用np.diff(Z) != 0
            • 创建mask
            • 使用maskxxyy
            • 中选择适当的xy

              • This is one solution that I came up with, which uses np.diff along both axes of Z, the .predict result. The idea being, whenever there is a change in result, that is a decision boundary.
                • Use .diff to subtract Z from itself, shifted by 1.
                • Create mask, using np.diff(Z) != 0
                • Use mask to select the appropriate x and y from xx and yy
                • # use diff to create a mask
                  mask = np.diff(Z, axis=1) != 0
                  mask2 = np.diff(Z, axis=0) != 0
                  
                  # apply mask against xx and yy
                  xd = np.concatenate((xx[:, 1:][mask], xx[1:, :][mask2]))
                  yd = np.concatenate((yy[:, 1:][mask], yy[1:, :][mask2]))
                  
                  # plot just the decision boundary
                  fig, ax = plt.subplots()
                  sns.scatterplot(x=xd, y=yd, color='k', edgecolor='k', s=5, ax=ax, label='decision boundary')
                  plt.show()
                  

                  fig, ax = plt.subplots()
                  sns.scatterplot(data=df, x='petal length (cm)', y='petal width (cm)', hue='species', ax=ax, edgecolor='k')
                  sns.scatterplot(x=xd, y=yd, color='k', edgecolor='k', s=5, ax=ax, label='decision boundary')
                  lgd = plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
                  

                  这篇关于如何从k最近邻预测中提取边界值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆