如何预测 KNN 中的值?

数据挖掘 机器学习 分类 k-nn
2021-09-26 03:18:56

我正在尝试为 IRIS 数据集构建 KNN 算法。首先,我计算了距离并将其存储在一维数组中。但是,我真的很难建立预测功能。因此出现了两个问题:

  1. 这段代码有什么作用?classes = y[np.argsort(dist)][:k]
  2. 给定某些要求,我应该如何更改函数的最后一个循环?
def KNN(k, X, y, x):
    from scipy.spatial.distance import cdist
    """K nearest neighbors
    k: number of nearest neighbors
    X: training input locations
    y: training labels
    x: test input
    """
    N, D = X.shape
    num_classes = len(np.unique(y))
    dist = np.zeros(X.shape[0])   # <-- EDIT THIS to compute the pairwise distance matrix
    for i in range(len(dist)):
        dist[i] = np.linalg.norm(X[i]-x)
    print(dist)

    # Next we make the predictions
    ypred = np.zeros(num_classes)
    classes = y[np.argsort(dist)][:k] # find the labels of the k nearest neighbors

    for c in np.unique(classes):
        ypred[c] = y[c]  # <-- EDIT THIS to compute the correct prediction
        print(ypred)
    return np.argmax(ypred)
```
3个回答

这是一个供您考虑的示例。

from sklearn.neighbors import KNeighborsClassifier
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"

# Assign colum names to the dataset
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']

# Read dataset to pandas dataframe
dataset = pd.read_csv(url, names=names)

dataset.head()

X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].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.20)

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)

X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors=5)
classifier.fit(X_train, y_train)

y_pred = classifier.predict(X_test)

from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

在此处输入图像描述

classifier = KNeighborsClassifier(n_neighbors=3)
classifier.fit(X, y)
testSet = [[5.1, 3.5, 1.4, .2]]
test = pd.DataFrame(testSet)
y_pred = classifier.predict(testSet)
print(y_pred)

最后一行代码将打印: ['Iris-setosa']

让我们看一下测试集中的第一行: testSet = [[5.1, 3.5, 1.4, .2]]

看着:dataset.head()

你看到y_pred课程怎么样了[5.1, 3.5, 1.4, .2]吗?

在此处输入图像描述

希望这是有道理的!现在,让我们稍微改变testSet一下,然后检查结果。

classifier = KNeighborsClassifier(n_neighbors=3)
classifier.fit(X, y)
testSet = [[5.1, 3.5, 4.9, .2]]
test = pd.DataFrame(testSet)
y_pred = classifier.predict(testSet)
print(y_pred)

结果:['Iris-versicolor']

变量('petal-length')从 1.4 变为 4.9,现在我们有了不同的 'Class'!是否有意义?如果您查看原始数据,您会发现testSet甚至不存在,但是,模型可以预测Class应该是什么!

Python 和 Scikit-Learn 中的 K-最近邻算法

您提到的代码按升序对数组进行排序并返回第一个 k 的参数(标签)。当您想预测一个类别时,您需要评估每个类别如何接近考虑的点。j 类的距离可以计算为所有带有标签 j 的点的总和 1/distance(x_i)**2,这些点位于 k 个最近点之间。然后你可以返回 ypred 的 argmax。(这是一种加权方法,它考虑了点之间的距离,另一方面,你可以只计算点的数量,这些点落入最近的 k 中)你应该写 ypred[c] = np.sum(np.where(classes= =c, 1, 0))

这段代码有什么作用?类 = y[np.argsort(dist)][:k]

此代码选择 y 的前 k 个示例,其中 y 已按 dist 中的距离排序。

例子

让我们假设dist = [2,0.5,10,5]在此示例中,此距离表明最近的两个元素位于位置 1 和 0。

如果我们查看 argsort 的输出,我们可以看到,确实,元素 1 和 0 是最接近的。

dist = [2,0.5,10,5]
np.argsort(dist)
array([1, 0, 3, 2])

那么让我们假设 k=2 并且y定义如下 L

y = np.array([0,2,1,0])
k = 2

然后y[np.argsort(dist)][0:k]简单地从 y 中选择元素 1 和 0

y[np.argsort(dist)][0:k]
array([2, 0])

给定某些要求,我应该如何更改函数的最后一个循环?

你应该给我们更多的细节。有什么要求?