6

我想用 scikit-learn 模块(http://scikit-learn.org/dev/modules/generated/sklearn.neighbors.KNeighborsClassifier.html)实现一个 KNeighborsClassifier

我从图像的稳固性、伸长率和 Humoments 特征中检索。我如何准备这些数据以进行训练和验证?我必须为我从图像中检索到的每个对象创建一个包含 3 个特征 [Hm, e, s] 的列表(从 1 个图像有更多对象)?

我读了这个例子(http://scikit-learn.org/dev/modules/generated/sklearn.neighbors.KNeighborsClassifier.html):

X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, y) 

print(neigh.predict([[1.1]]))
print(neigh.predict_proba([[0.9]]))

X 和 y 是 2 个特征?

samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
from sklearn.neighbors import NearestNeighbors
neigh = NearestNeighbors(n_neighbors=1)
neigh.fit(samples) 

print(neigh.kneighbors([1., 1., 1.])) 

为什么在第一个示例中使用 X 和 y 现在采样?

4

1 回答 1

13

您的第一段代码定义了1d数据分类器。

X表示特征向量。

[0] is the feature vector of the first data example
[1] is the feature vector of the second data example
....
[[0],[1],[2],[3]] is a list of all data examples, 
  each example has only 1 feature.

y代表标签。

下图显示了这个想法:

在此处输入图像描述

  • 绿色节点是标签为 0 的数据
  • 红色节点是标签为 1 的数据
  • 灰色节点是带有未知标签的数据。
    打印(neigh.predict([[1.1]]))

这是要求分类器预测 的标签x=1.1

    print(neigh.predict_proba([[0.9]]))

这是要求分类器为每个标签提供成员概率估计。

由于两个灰色节点都更靠近绿色,因此下面的输出是有意义的。

    [0] # green label
    [[ 0.66666667  0.33333333]]  # green label has greater probability

第二段代码实际上有很好的说明scikit-learn

在下面的示例中,我们从表示我们的数据集的数组构造一个 NeighborsClassifier 类,并询问谁是最接近 [1,1,1] 的点

>>> 样本 = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
>>> 从 sklearn.neighbors 导入 NearestNeighbors
>>> neigh = NearestNeighbors(n_neighbors=1)
>>> neigh.fit(样本)
NearestNeighbors(算法='auto',leaf_size=30,...)
>>> print(neigh.kneighbors([1., 1., 1.]))
(数组([[ 0.5]]),数组([[2]]...))

这里没有目标值,因为这只是一个NearestNeighbors类,它不是分类器,因此不需要标签。

对于您自己的问题:

既然你需要一个分类器,你应该求助于KNeighborsClassifier如果你想使用KNN方法。您可能希望构建特征向量X和标签y,如下所示:

X = [ [h1, e1, s1], 
      [h2, e2, s2],
      ...
    ]
y = [label1, label2, ..., ]
于 2013-01-24T21:41:05.457 回答