我在weka上使用k最近邻分类器(http://weka.sourceforge.net/doc.dev/weka/classifiers/lazy/IBk.html).
我想欧几里德距离是默认的距离函数.我如何更改该功能并使用与我自己的距离函数相同的类?
谢谢,
马尔科
我写了一些K-nearest-neighbor查询方法,它们构建了一个最接近给定查询点的点列表.为了维护该邻居列表,我使用std::priority_queue了top元素是查询点的最远邻居.这样我知道是否应该推送当前正在检查的新元素(如果距离当前最远的邻居的距离较小),并且当我的优先级队列具有多于K个元素时,可以弹出()最远的元素.
到目前为止,一切都很好.但是,当我输出元素时,我想从最接近最远的位置订购它们.目前,我只是从优先级队列中弹出所有元素并将它们放在输出容器上(通过迭代器),这会导致从最远到最近排序的一系列点,因此,我调用std::reverse输出迭代器范围.
举个简单的例子,这里是一个使用优先级队列的线性搜索(显然,我使用的实际最近邻查询方法要复杂得多):
template <typename DistanceValue,
typename ForwardIterator,
typename OutputIterator,
typename GetDistanceFunction,
typename CompareFunction>
inline
OutputIterator min_dist_linear_search(ForwardIterator first,
ForwardIterator last,
OutputIterator output_first,
GetDistanceFunction distance,
CompareFunction compare,
std::size_t max_neighbors = 1,
DistanceValue radius = std::numeric_limits<DistanceValue>::infinity()) {
if(first == last)
return output_first;
typedef std::priority_queue< std::pair<DistanceValue, ForwardIterator>,
std::vector< std::pair<DistanceValue, ForwardIterator> >,
detail::compare_pair_first<DistanceValue, ForwardIterator, CompareFunction> > PriorityQueue;
PriorityQueue output_queue = PriorityQueue(detail::compare_pair_first<DistanceValue, ForwardIterator, CompareFunction>(compare));
for(; first != last; ++first) {
DistanceValue d = distance(*first);
if(!compare(d, radius))
continue;
output_queue.push(std::pair<DistanceValue, ForwardIterator>(d, first));
while(output_queue.size() …Run Code Online (Sandbox Code Playgroud) 我有关于在matlab中计算分类器的精度和召回率的问题.我使用fisherIris数据(由150个数据点,50个setosa,50个versicolor,50个virginica组成).我使用kNN算法进行了分类.这是我的困惑矩阵:
50 0 0
0 48 2
0 4 46
Run Code Online (Sandbox Code Playgroud)
正确的分类率是96%(144/150),但如何用matlab计算精度和召回率,有什么功能吗?我知道该精度的公式= tp /(tp + fp),并且召回= tp /(tp + fn),但我在识别组件时丢失了.例如,我可以说矩阵的真阳性是144吗?假阳性和假阴性怎么样?请帮忙!!!我真的很感激!谢谢!
我有一个矩阵ZZ。在我运行prcomp并选择前 5 台 PC 后,我得到data_new:
P= prcomp(zz)
data_new = P$x[,1:5]
Run Code Online (Sandbox Code Playgroud)
然后我分成训练集和测试集
pca_train = data_new[1:121,]
pca_test = data_new[122:151,]
Run Code Online (Sandbox Code Playgroud)
并使用 KNN:
k <- knn(pca_train, pca_test, tempGenre_train[,1], k = 5)
a <- data.frame(k)
res <- length(which(a!=tempGenre_test))
Run Code Online (Sandbox Code Playgroud)
每次运行最后 3 行时,我都会在res中得到不同的值。为什么?
有没有更好的方法来检查测试错误是什么?
当计算平均值 x最近邻时,Sklearn-KNN允许设置权重(例如,均匀,距离)。
相反,与预测的平均值,是否有可能与预测值(或许还有一个用户定义的函数)?
是否可以在 SKLearn 中定义 K 最近邻分类器的类权重?我查看了API,但无法解决。我有一个 knn 问题,它的类数量非常不平衡(其中一些为 10000 个,其他为 1 个)。
我正在尝试在使用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 与预先计算的内核矩阵(这不是孤立的情况)一起使用的人。
我使用预先计算的指标使用 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 的训练矩阵。
最好的问候和谢谢。:-)
我有以下代码来估计epsDBSCAN。如果代码没问题,那么我已经获得了knn distance plot. 代码是:
ns = 4
nbrs = NearestNeighbors(n_neighbors=ns).fit(data)
distances, indices = nbrs.kneighbors(data)
distanceDec = sorted(distances[:,ns-1], reverse=True)
plt.plot(indices[:,0], distanceDec)
Run Code Online (Sandbox Code Playgroud)
data像素位置数组(行和列)在哪里。我已经获得了一个情节,但我不知道如何确定eps. 根据DBSCAN论文,
阈值点是排序后的 k-dist 图的第一个谷中的第一个点
我不知道如何在代码中实现它。此外,是ns = 4我的minPts还是有什么办法来估计minPts从eps?
我试图实现KNN进行手写字符识别,结果发现执行代码要花费很多时间。当将参数leaf_size添加为值400时,我观察到代码执行所需的时间大大减少了。
原始代码:
knn = KNeighborsClassifier(n_neighbors=3)
Run Code Online (Sandbox Code Playgroud)
新代码:
knn = KNeighborsClassifier(n_neighbors=3,leaf_size=400)
Run Code Online (Sandbox Code Playgroud)
我读了很少的有关KDtree / Balltree的leaf_size参数的文档和文章,但是找不到有关如何安全调整此参数而又没有任何准确性和信息丢失的足够好的参考。
如果有人可以就上述问题分享一些见解,那将是非常友善的。
我提到的相关文章:
1.)http://scikit-learn.org/stable/modules/genic/sklearn.neighbors.KDTree.html
2.)https://jakevdp.github.io/blog/2013/04 / 29 / benchmarking-nearest-neighbor-searches-in-python /
3.)http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html