s****i 发帖数: 197 | 1 请问python sklearn nearest neighbor user defined metric具体语句该怎样写的??
像是
nbrs = NearestNeighbors(n_neighbors=4,algorithm='auto',metric='pyfunc').fit(
B)
distances, indices = nbrs.kneighbors(B)
这样?但是这个会给我一个error
ValueError: Unknown Distance Metric: pyfunc
但是从sklearn的document上看这东西应该是支持自定义distance的阿??
我知道这个问题真的很2大家b4我把。。。
===============================================
其实就一关键字。。。
nbrs = NearestNeighbors(n_neighbors=4, algorithm='ball_tree',metric='pyfunc'
,func=mydist).fit(A)
distances, indices = nbrs.kneighbors(A)
原来会有error完全是因为只有algorithm='ball_tree'支持 其他kd_tree brute都
不支持 | s****i 发帖数: 197 | | c***z 发帖数: 6348 | 3 maybe check up or ask at www.stackoverflow.com? | s****i 发帖数: 197 | 4 check 了已经 结果所有都回答不支持 但是那是几个月前的回答现在document上说支持
了就应该已经更新版本变支持了吧。。。。我猜。。。。 | c***z 发帖数: 6348 | 5 。。。。我猜。。。。
I think you need to guess again then :P | l*******m 发帖数: 1096 | 6 I think your distance function was defined in a wrong way. Here is an
example
def test_pyfunc_metric():
def dist_func(x1, x2, p):
return np.sum((x1 - x2) ** p) ** (1. / p)
X = np.random.random((10, 3))
euclidean = DistanceMetric.get_metric("euclidean")
pyfunc = DistanceMetric.get_metric("pyfunc", func=dist_func, p=2)
D1 = euclidean.pairwise(X)
D2 = pyfunc.pairwise(X)
assert_array_almost_equal(D1, D2)
I didn't know it before, just checked source codes for you.
https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/neighbors/
tests/test_dist_metrics.py
There is a defination
cdef class PyFuncDistance(DistanceMetric):
"""PyFunc Distance
A user-defined distance
Parameters
----------
func : function
func should take two numpy arrays as input, and return a distance.
"""
def __init__(self, func, **kwargs):
self.func = func
x = np.random.random(10)
try:
d = self.func(x, x, **kwargs)
except TypeError:
raise ValueError("func must be a callable taking two arrays")
try:
d = float(d)
except TypeError:
raise ValueError("func must return a float")
self.kwargs = kwargs
cdef inline DTYPE_t dist(self, DTYPE_t* x1, DTYPE_t* x2,
ITYPE_t size) except -1:
cdef np.ndarray x1arr = _buffer_to_ndarray(x1, size)
cdef np.ndarray x2arr = _buffer_to_ndarray(x2, size)
return self.func(x1arr, x2arr, **self.kwargs)
【在 s****i 的大作中提到】 : check 了已经 结果所有都回答不支持 但是那是几个月前的回答现在document上说支持 : 了就应该已经更新版本变支持了吧。。。。我猜。。。。
|
|