首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用中位数(而不是平均值)预测sklearn KNN

使用中位数(而不是平均值)预测sklearn KNN
EN

Stack Overflow用户
提问于 2015-11-15 04:25:06
回答 1查看 2.2K关注 0票数 9

当计算平均x近邻时,Sklearn KNN允许设置权重(例如,均匀、距离)。

与其用平均值进行预测,还能用中位数(也许是用用户定义的函数)进行预测吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-15 05:20:17

没有内置参数来调整权重以使用中位数而不是平均值(您可以看到均值是硬编码的在源头 )。但是,由于scikit-learn估值器只是Python类,所以您可以子类KNeighborsRegressor并重写predict方法来执行您想做的任何事情。

下面是一个快速示例,其中我复制和粘贴了原始的predict()方法并修改了相关的部分:

代码语言:javascript
复制
from sklearn.neighbors.regression import KNeighborsRegressor, check_array, _get_weights

class MedianKNNRegressor(KNeighborsRegressor):
    def predict(self, X):
        X = check_array(X, accept_sparse='csr')

        neigh_dist, neigh_ind = self.kneighbors(X)

        weights = _get_weights(neigh_dist, self.weights)

        _y = self._y
        if _y.ndim == 1:
            _y = _y.reshape((-1, 1))

        ######## Begin modification
        if weights is None:
            y_pred = np.median(_y[neigh_ind], axis=1)
        else:
            # y_pred = weighted_median(_y[neigh_ind], weights, axis=1)
            raise NotImplementedError("weighted median")
        ######### End modification

        if self._y.ndim == 1:
            y_pred = y_pred.ravel()

        return y_pred    

X = np.random.rand(100, 1)
y = 20 * X.ravel() + np.random.rand(100)
clf = MedianKNNRegressor().fit(X, y)
print(clf.predict(X[:5]))
# [  2.38172861  13.3871126    9.6737255    2.77561858  17.07392584]

我省略了加权版本,因为我不知道用numpy/scipy计算加权中值的简单方法,但是一旦函数可用,就可以简单地添加。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33716395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档