小编Mik*_*awk的帖子

Numpy的Kronecker三角洲

有没有一种方便的方法来初始化根据Kronecker delta定义的Numpy数组?在一个理想的世界中,会有一个叫做kron_delta的函数,这样如果我设置M = kron_delta('ij,kl',5),那么M将是一个5x5x5x5数组,其中M [i,j,k,l每当i = j且k = 1时,则= 1,否则为0.我的问题是是否存在像kron_delta这样的函数.

后续:如果没有,是否还有一种方便的方法来初始化数组delta(ijk)(即,只要所有索引相等,nxnxn数组为1,否则为0)?

python arrays numpy

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

为什么 KNN 的余弦距离比欧几里得距离快得多?

我正在使用 scikit learn 拟合 k 最近邻分类器,并注意到与使用欧几里得相似性相比,使用两个向量之间的余弦相似性时拟合速度更快,通常是一个数量级或更多。请注意,这两个都是 sklearn 内置的;我没有使用任一指标的自定义实现。

如此大的差异背后的原因是什么?我知道 scikit learn 使用球树或 KD 树来计算邻居图,但我不确定为什么度量的形式会影响算法的运行时间。

为了量化效果,我进行了一个模拟实验,在该实验中,我使用欧几里得或余弦度量将 KNN 拟合到随机数据,并记录了每种情况下的运行时间。每种情况下的平均运行时间如下所示:

import numpy as np
import time
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
res=[]
n_trials=10
for trial_id in range(n_trials):
    for n_pts in [100,300,1000,3000,10000,30000,100000]:
        for metric in ['cosine','euclidean']:
            knn=KNeighborsClassifier(n_neighbors=20,metric=metric)
            X=np.random.randn(n_pts,100)
            labs=np.random.choice(2,n_pts)
            starttime=time.time()
            knn.fit(X,labs)
            elapsed=time.time()-starttime
            res.append([elapsed,n_pts,metric,trial_id])

res=pd.DataFrame(res,columns=['time','size','metric','trial'])
av_times=pd.pivot_table(res,index='size',columns='metric',values='time')
print(av_times)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

编辑:这些结果来自带有 sklearn 0.21.3 版的 MacBook。我还在使用 sklearn 0.23.2 版的 Ubuntu 台式机上复制了效果。

algorithm performance machine-learning knn scikit-learn

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

Python相当于c ++ find_if

是否有内置的python等效std::find_if于查找给定条件的列表的第一个元素true?换句话说,类似于index()列表的功能,但具有任意的一元谓词,而不仅仅是对相等性的测试.

我不想使用列表理解,因为我想到的特定谓词计算起来有些昂贵.

python syntax

3
推荐指数
1
解决办法
604
查看次数