标签: knn

K最近邻算法怀疑

我是人工智能的新手.我理解K最近邻算法以及如何实现它.但是,你如何计算不规模的东西的距离或重量?

例如,可以很容易地计算年龄距离,但是如何计算红色到蓝色的距离?也许颜色是一个不好的例子,因为你仍然可以说使用频率.比如汉堡比萨饼到炸薯条怎么样?

我觉得有一种聪明的方法可以做到这一点.

提前感谢您的关注.

编辑:谢谢大家非常好的答案.它真的有帮助,我很感激.但我认为必须有一条出路.

我可以这样做吗?假设我正在使用我的KNN算法对一个人进行预测,看他/她是否会在我的餐厅吃饭,该餐厅供应上述三种食物.当然,还有其他因素,但为了保持简单,对于喜爱的食物领域,300人,150喜欢汉堡,100喜欢披萨,50喜欢薯条.常识告诉我,最喜欢的食物影响人们决定是否进食.

因此,现在一个人将他/她最喜欢的食物作为汉堡进入,我将预测他/她是否会在我的餐厅吃饭.忽略其他因素,并且基于我的(训练)先前的知识库,常识告诉我,与他进入披萨或薯条相比,这个特定领域最喜欢的食物的k个最近邻居的距离更接近.

唯一的问题是我使用概率,我可能是错的,因为我不知道,可能无法计算实际距离.我也担心这个领域对我的预测投入太多/太少的重量,因为距离可能不是与其他因素(价格,一天中的时间,餐厅是否已满,我可以轻易量化等)的比例.但我我想我可以用一些参数调整来解决它.

哦,每个人都提出了一个很好的答案,但我只能接受一个.在那种情况下,我明天会接受票数最高的那个.再次感谢大家.

algorithm artificial-intelligence knn

7
推荐指数
3
解决办法
2777
查看次数

如何将距离转换为概率?

有人为我的matlab程序发光吗?我有来自两个传感器的数据,我正在kNN分别对它们进行分类.在这两种情况下,训练集看起来像一组总共42行的向量,如下所示:

[44 12 53 29 35 30 49;

 54 36 58 30 38 24 37;..]
Run Code Online (Sandbox Code Playgroud)

然后我得到一个样本,例如[40 30 50 25 40 25 30],我想将样本分类到最近的邻居.作为接近度的标准,我使用欧几里德度量,sqrt(sum(Y 2)),其中Y是每个元素之间的差异,它给出了Sample和每个训练集类别之间的距离数组.

那么,有两个问题:

  • 是否可以将距离转换为概率分布,如:Class1:60%,Class 2:30%,Class 3:5%,Class 5:1%等.

补充:到目前为止我正在使用公式:probability = distance/sum of distances但我无法绘制正确的cdf或直方图.这给了我一些分布,但我看到了一个问题,因为如果距离很大,例如700,那么最接近的类将获得最大的概率,但它是错的,因为距离太大而不能与任何课程相比.

  • 如果我能够获得两个概率密度函数,我想我会做一些它们的产品.可能吗?

任何帮助或评论都非常感谢.

matlab classification knn euclidean-distance probability-density

7
推荐指数
2
解决办法
5832
查看次数

与OpenCV的硬币模板匹配

我正在进行一个项目,它将自动计算输入图像中的硬币值.到目前为止,我已经使用边缘检测和使用霍夫变换进行了一些预处理来分割硬币.

我的问题是如何从这里开始?我需要根据以前存储的一些功能对分割的图像进行一些模板匹配.我怎么能这样做呢.

我还读过一些叫做K-Nearest Neighbors的东西,我觉得这是我应该使用的东西.但我不太清楚如何使用它.

我遵循的研究文章:

c++ opencv feature-extraction knn feature-detection

7
推荐指数
1
解决办法
2216
查看次数

如何在微小图像上使用Opencv FeatureDetecter

我在Java中使用Opencv 3,我试图在其他图像上找到小图像(如25x25像素).但FeatureDetector检测(0,0)大小Mat在小图像上.

    Mat smallImage = ...

    FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
    DescriptorExtractor descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB);
    DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);

    Mat descriptorsSmall = new Mat();
    MatOfKeyPoint keyPointsSmall = new MatOfKeyPoint();

    detector.detect(smallImage, keyPointsSmall);
    descriptor.compute(smallImage, keyPointsSmall, descriptorsSmall);
Run Code Online (Sandbox Code Playgroud)

在这里,我得到keyPointsSmall和descriptorsSmall大小为零,并确保检测不起作用.

但是,如果我在150x150像素的较大图像上尝试此功能,那就可以了.有什么建议?谢谢.

我在这里添加样品.我们有这个源图像: 这是源图像

并且让它说我们有P字母的模板,所以我们需要在源图像上检测这个P. 这是模板

好吧,将图像缩放到更高的分辨率对我来说不起作用.这将耗费时间和资源.理想情况下,它应该是旋转尺度不变的.但是没有旋转和缩放的简单解决方案也可以.

除OpenCv之外的其他解决方案对我来说是不可接受的.(例如使用Tesseract)

java opencv knn

7
推荐指数
1
解决办法
476
查看次数

Scikit-learn中KNN分类器中的网格搜索参数和交叉验证数据集

我正在尝试使用SciKit-Learn执行我的第一个KNN分类器.我一直在关注用户指南和其他在线示例,但有一些我不确定的事情.对于这篇文章,我们使用以下内容

X =数据Y =目标

1)在我读过的机器学习页面的大多数介绍中,似乎说你想要一个训练集,一个验证集和一个测试集.根据我的理解,交叉验证允许您组合训练和验证集来训练模型,然后您应该在测试集上测试它以获得分数.但是,我在论文中看到,在很多情况下,您只需对整个数据集进行交叉验证,然后将CV分数报告为准确性.我理解在一个理想的世界中你会想要测试单独的数据,但如果这是合法的,我想在我的整个数据集上交叉验证并报告这些分数

2)开始这个过程

我将KNN分类器定义如下

knn = KNeighborsClassifier(algorithm = 'brute')
Run Code Online (Sandbox Code Playgroud)

我使用搜索最好的n_neighbors

clf = GridSearchCV(knn, parameters, cv=5)
Run Code Online (Sandbox Code Playgroud)

现在,如果我说

clf.fit(X,Y)
Run Code Online (Sandbox Code Playgroud)

我可以使用检查最佳参数

clf.best_params_
Run Code Online (Sandbox Code Playgroud)

然后我就能得分

clf.score(X,Y)
Run Code Online (Sandbox Code Playgroud)

但是 - 据我所知,这还没有交叉验证模型,因为它只给出1分?

如果我看到clf.best_params_ = 14,我现在可以继续

knn2 = KNeighborsClassifier(n_neighbors = 14, algorithm='brute')
cross_val_score(knn2, X, Y, cv=5)
Run Code Online (Sandbox Code Playgroud)

现在我知道数据已经过交叉验证,但我不知道使用clf.fit找到最佳参数是否合法,然后将cross_val_score与新的knn模型一起使用?

3)我理解这样做的"正确"方法如下

拆分为X_train,X_test,Y_train,Y_test,比例训练集 - >将转换应用于测试集

knn = KNeighborsClassifier(algorithm = 'brute')
clf = GridSearchCV(knn, parameters, cv=5)
clf.fit(X_train,Y_train)
clf.best_params_
Run Code Online (Sandbox Code Playgroud)

然后我就能得分

clf.score(X_test,Y_test)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,使用最佳参数计算得分吗?


我希望这是有道理的.我一直试图尽可能多地找到我没有发布但我已经到了我认为更容易得到一些直接答案的地步.

在我的脑海中,我试图使用整个数据集获得一些交叉验证的分数,但也使用gridsearch(或类似的东西)来微调参数.

提前致谢

knn scikit-learn cross-validation grid-search

7
推荐指数
2
解决办法
6091
查看次数

欧几里德距离,Scipy,纯Python和Java之间的结果不同

我正在玩欧几里德距离度量的不同实现,我注意到我得到了Scipy,纯Python和Java的不同结果.

以下是我使用Scipy(=选项1)计算距离的方法:

distance = scipy.spatial.distance.euclidean(sample, training_vector)
Run Code Online (Sandbox Code Playgroud)

这是我在论坛中发现的Python实现(选项2):

distance = math.sqrt(sum([(a - b) ** 2 for a, b in zip(training_vector, sample)]))
Run Code Online (Sandbox Code Playgroud)

最后,这是我在Java中的实现(选项3):

public double distance(int[] a, int[] b) {
    assert a.length == b.length;
    double squaredDistance = 0.0;
    for(int i=0; i<a.length; i++){
        squaredDistance += Math.pow(a[i] - b[i], 2.0);
    }
    return Math.sqrt(squaredDistance);
}
Run Code Online (Sandbox Code Playgroud)

两个sampletraining_vector与长度784 1-d阵列,从所述数据集MNIST截取.我尝试了所有三种方法相同的sampletraining_vector.问题在于三种不同的方法导致三种显着不同的距离(即,选项1约为1936,选项2约为1914,选项3为1382).有趣的是,当我用同样的理由为了sampletraining_vector在选项1和2(即翻转参数选项1左右),我得到了这两个选项的结果相同.但距离指标应该是对称的,对吧......?

还有趣的是:我将这些指标用于MNIST数据集的k-NN分类器.对于100个测试样本和2700个训练样本,我的Java实现产生了大约94%的准确度.但是,使用选项1的Python实现仅产生约75%的准确度......

你有什么想法,为什么我得到这些不同的结果?如果您有兴趣,我可以在线发布两个阵列的CSV,并在此处发布链接.

我正在使用Java 8,Python 2.7和Scipy 1.0.0.

编辑: 将选项2更改为

distance = math.sqrt(sum([(float(a) - float(b)) ** 2 for …
Run Code Online (Sandbox Code Playgroud)

python java scipy knn euclidean-distance

7
推荐指数
1
解决办法
372
查看次数

为什么 metric='precomputed' 在 sk-learn 的 k-nearest 邻居中不起作用?

我正在尝试在使用http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html时拟合预先计算的内核矩阵,这显然是可能的,因为存在“预计算”指标。我允许你传递一个 n_samples*n_samples 核矩阵来拟合方法。

使用它时,这是我得到的:

ValueError:指标“预计算”对算法“自动”无效

我不明白如何使用算法“自动”来查找最近的邻居与我使用预先计算的内核矩阵的事实不兼容。

编辑 :

不幸的是,我的问题没有得到任何关注。我已经更深入地研究了源代码,似乎有一个错误,因为当你通过时metric=precomputed,因为代码应该允许你选择algorithm=auto. 相反,在运行时,代码会遇到我提到的 valueError,我认为作者不希望他的代码表现得那样。我不知道如何更改源代码以使其正常运行。

另外我想补充一个问题,从更理论的角度来看,能够使用核矩阵(又名克矩阵)来使用 kNN 的拟合方法是完全合理的。您可以从 gram 矩阵中推导出距离矩阵,然后当您想要预测新数据时,您只需找到 k 个最近的邻居,并使用 k 个最近邻居中最新的标签标记新数据。

我真的认为这个问题应该得到答案。这是正确的问题,我想要一些非常精确的东西,我知道对 Python 和 scikit learn 库有更深入了解的人应该能够回答它。也许我遗漏了一些明显的东西,但我也认为它应该可以帮助任何尝试将 kNN 与预先计算的内核矩阵(这不是孤立的情况)一起使用的人。

knn scikit-learn

6
推荐指数
1
解决办法
1385
查看次数

用于拟合 scikit 邻居/半径分类的预计算矩阵

我使用预先计算的指标使用 Scikit-Learn 的最近邻/半径分类。这意味着,我将成对距离的 n_samples_train x n_samples_train 矩阵传递给分类器的拟合方法。

现在我想知道为什么必须这样做。使用 knn 学习只是意味着“存储样本”,但距离的计算应该只在稍后的泛化过程中进行(在该步骤中,我当然会计算训练样本和测试样本之间的距离矩阵,因此大小为 n_samples_train x n_samples_test 的矩阵)。

例如,在 SVM 的情况下,我将一个预先计算的矩阵(Gramian,一个相似性矩阵)传递给 smv.SVC 对象的 fit 方法。然后进行优化,找到支持向量等等。在那里,该矩阵在训练期间是绝对必要的。

但是我看不出为什么需要一个预先计算的矩阵来拟合邻居/半径分类。

有人可以给我一个相关的提示吗?

我很想跳过使用 scikit learn 计算 knn 的训练矩阵。

最好的问候和谢谢。:-)

matrix knn precompute scikit-learn

6
推荐指数
1
解决办法
1143
查看次数

在 KNN 中获得概率为 0 或 1 (predict_proba)

我使用 sklearn 的 KNN 并使用 predict_proba 预测标签。我期待 0 到 1 范围内的值,因为它告诉了特定类别的概率。但我只得到 0 & 1。

我也放了很大的 k 值,但没有任何收益。虽然我只有 1000 个样本,特征在 200 左右,而且矩阵在很大程度上是稀疏的。

谁能告诉我这里的解决方案是什么?

knn scikit-learn

6
推荐指数
1
解决办法
2468
查看次数

如何解释 cv.kknn(kknn 包)的交叉验证输出

我试图解释在尝试交叉验证 k 最近邻模型的数据时得到的结果。我的数据集设置如下

变量 1(int) | 变量2(整数)| 变量 3(int) | 变量4(整数)| 响应(因子)

选择模型后,我将 80% 的数据分成 cvdata,20% 用于测试。

我的代码的一次迭代如下:

    cv <- cv.kknn(formula = Response~., cvdata, kcv = 10, k = 7, kernel = 'optimal', scale = TRUE)
    cv
Run Code Online (Sandbox Code Playgroud)

当我运行“cv”时,它只返回一个 list(),其中包含一些看似随机的数字作为行名、观察到的结果变量 (y) 和预测结果变量 (yhat)。我正在尝试计算测试集的某种准确性。我应该将 y 与 yhat 进行比较来验证吗?

编辑:输出添加到下面

    [[1]]
         y        yhat
    492 1 0.724282776
    654 0 0.250394372
    427 0 0.125159894
    283 0 0.098561768
    218 1 0.409990851

    [[2]]
     [1] 0.2267058 0.1060212
Run Code Online (Sandbox Code Playgroud)

r knn cross-validation

6
推荐指数
1
解决办法
8430
查看次数