簡體   English   中英

如何從k-最近鄰預測中提取邊界值

[英]How to extract the boundary values from k-nearest neighbors predict

地雷

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()

結果圖

在此處輸入圖片說明

想要的情節

  • 不是顏色或樣式,只是它只有決策邊界和數據點。

在此處輸入圖片說明

資源

SO 沒有回答問題的問題

自我回答

  • 我已經提供了一個解決方案,但我不確定它是否是最好的解決方案。 我當然願意接受其他選擇。
  • 也就是說,我不想要一個在contourfpcolormesh圖中有顏色的解決方案。
  • 簡而言之,最好的解決方案是僅提取決策邊界值。
  • 這是我想出了,它使用一個解決方案np.diff沿兩個軸Z.predict結果。 這個想法是,每當結果發生變化時,這就是一個決策邊界。
    • 使用.diff從自身中減去Z ,然后移動 1。
    • 創建mask ,使用np.diff(Z) != 0
    • 使用maskxxyy選擇合適的xy
  • 使用來自 OP 的現有代碼
# 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')

在此處輸入圖片說明

xdyd正確覆蓋plt.contourf

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM