我需要使用具有自定义指标的K最近邻居。我有一个适用于我的对象属性的公式。这意味着我有矩阵。此矩阵由向量组成,每个向量包含公式中使用的3个标量值。
我在库sklearn中找到了如何在类KNeighborsClassifier
中使用自定义指标。它只是一个名为metric的参数,可以是字符串或可调用的。所以...我已经创建了函数,但是这个函数在第一次采用两个相同的数组包含10个标量值。我的意思是每个数组都包含10个值而不是3.在每个后续时间,该函数从我的矩阵中获取值。
我已经查看了调用堆栈,并且我已经看到该函数从类BallTree
调用。我已经阅读过这个结构,但我无法理解它是如何转换我的数据或它第一次传递给我的指标的。
这两个第一个相同的数组是什么意思?
我通过此代码实例化分类器
clf = KNeighborsClassifier(n_jobs=4, metric=custom_metric)
clf.fit(X, Y)
X包含这样的值。
array([[2.400154, 0.07744107744107744, 96.80566400000001],
[2.39325, 0.07744107744107744, 97.219544],
[2.395162, 0.07744107744107744, 97.10519599999999],
[3.101635, 0.009788768675940238, 65.88368],
[3.09882, 0.009788768675940238, 65.97364499999999],
[3.099576, 0.009788768675940238, 65.956018]], dtype=object)
custom_metric
是我的功能。它现在什么都没有。
def custom_metric(x: np.ndarray, y: np.ndarray) -> float:
pass
x
和y
array([ 0.02274535, 0.21161613, 0.41314247, 0.39046054, 0.1670481 ,
0.15515555, 0.13329802, 0.59103014, 0.26246693, 0.7727967 ])
正如我上面写的那样,它们是相同的。
对不起,如果我的英语不清楚。
答案 0 :(得分:0)
你提供的代码片段没有多大意义,knn metric永远不会作为一个参数来自不同的空间而不是你训练它的那个,最小的例子来展示它:
submit
按预期打印
$(function() {
var form = $("form");
form.on("submit", function(e) {
e.preventDefault();
var cloudName = $('input[name="cloud_name"]').val(),
presetName = $('input[name="upload_preset"]').val(),
URL = "https://api.cloudinary.com/v1_1/" + cloudName + "/image/upload",
input = form.find("[name=file]");
$.when.apply($, $.map(input[0].files, function(file, index) {
var data = new FormData(form[0]);
data.append("upload_preset", file, file.name);
return $.ajax({
type: 'post',
url: URL,
data: data,
processData: false,
contentType: false,
cache: false
});
}))
.then(function(response) {
console.log(response)
})
.catch(function(err) {
console.log(err)
})
})
})
因此在你的情况下,matric应该接受2个向量,每个3维,并返回它们之间的有效距离,这就是全部。
如果您传递给import numpy as np
x = np.array(range(10)).reshape(5,-1)
y = np.array(range(5))
from sklearn.neighbors import KNeighborsClassifier as KNN
def foo(X, Y):
print 'X', X, X.shape
print 'Y', Y, Y.shape
return 0
clf = KNN(metric=foo)
clf.fit(x, y)
clf.predict(x)
具有此类维度的内容,则只能获得10个维度。没有什么"魔法"隐藏在BallTree中,它必须在您的数据中。