解读以下代码:eps = np.finfo(np.float32).eps recalls = tp / np.maximum(num_gts[:, np.newaxis], eps)
时间: 2023-06-09 09:07:33 浏览: 239
这段代码是用来计算召回率(recall)的。eps是一个极小值,以避免出现除以0的情况。tp表示真正例(true positives),num_gts表示总的正例数(包括真正例和假负例)。np.maximum函数用于比较num_gts和eps,取得它们之间的最大值,以确保分母不会出现0的情况。然后将tp和分母相除,计算出召回率。
相关问题
打印每个numpy标量类型的最小值和最大值 (提示: np.iinfo, np.finfo, eps)
在Python的NumPy库中,你可以使用`np.iinfo`和`np.finfo`来获取整数和浮点数类型的数据类型信息,包括它们的最大值和最小值。`eps`通常指的是浮点类型能表示的最小正数,也称为机器精度。
1. 对于整数类型,你可以创建`np.iinfo`的实例来获取特定整数类型的最大和最小值。例如,对于`np.int8`类型:
```python
import numpy as np
info = np.iinfo(np.int8)
print("最小值:", info.min)
print("最大值:", info.max)
```
2. 对于浮点数类型,你可以使用`np.finfo`来获取浮点类型的最大值和最小值,以及`eps`值。例如,对于`np.float32`类型:
```python
info = np.finfo(np.float32)
print("最小值:", info.min)
print("最大值:", info.max)
print("机器精度:", info.eps)
```
注意,`eps`是浮点数能够区分的两个相邻值之间的差值,这个值是浮点数精度的一个重要指标。
class SVDRecommender: def __init__(self, k=50, ncv=None, tol=0, which='LM', v0=None, maxiter=None, return_singular_vectors=True, solver='arpack'): self.k = k self.ncv = ncv self.tol = tol self.which = which self.v0 = v0 self.maxiter = maxiter self.return_singular_vectors = return_singular_vectors self.solver = solver def svds(self, A): if self.which == 'LM': largest = True elif self.which == 'SM': largest = False else: raise ValueError("which must be either 'LM' or 'SM'.") if not (isinstance(A, LinearOperator) or isspmatrix(A) or is_pydata_spmatrix(A)): A = np.asarray(A) n, m = A.shape if self.k <= 0 or self.k >= min(n, m): raise ValueError("k must be between 1 and min(A.shape), k=%d" % self.k) if isinstance(A, LinearOperator): if n > m: X_dot = A.matvec X_matmat = A.matmat XH_dot = A.rmatvec XH_mat = A.rmatmat else: X_dot = A.rmatvec X_matmat = A.rmatmat XH_dot = A.matvec XH_mat = A.matmat dtype = getattr(A, 'dtype', None) if dtype is None: dtype = A.dot(np.zeros([m, 1])).dtype else: if n > m: X_dot = X_matmat = A.dot XH_dot = XH_mat = _herm(A).dot else: XH_dot = XH_mat = A.dot X_dot = X_matmat = _herm(A).dot def matvec_XH_X(x): return XH_dot(X_dot(x)) def matmat_XH_X(x): return XH_mat(X_matmat(x)) XH_X = LinearOperator(matvec=matvec_XH_X, dtype=A.dtype, matmat=matmat_XH_X, shape=(min(A.shape), min(A.shape))) #获得隐式定义的格拉米矩阵的低秩近似。 eigvals, eigvec = eigsh(XH_X, k=self.k, tol=self.tol ** 2, maxiter=self.maxiter, ncv=self.ncv, which=self.which, v0=self.v0) #格拉米矩阵有实非负特征值。 eigvals = np.maximum(eigvals.real, 0) #使用来自pinvh的小特征值的复数检测。 t = eigvec.dtype.char.lower() factor = {'f': 1E3, 'd': 1E6} cond = factor[t] * np.finfo(t).eps cutoff = cond * np.max(eigvals) #获得一个指示哪些本征对不是简并微小的掩码, #并为阈值奇异值创建一个重新排序数组。 above_cutoff = (eigvals > cutoff) nlarge = above_cutoff.sum() nsmall = self.k - nlarge slarge = np.sqrt(eigvals[above_cutoff]) s = np.zeros_like(eigvals) s[:nlarge] = slarge if not self.return_singular_vectors: return np.sort(s) if n > m: vlarge = eigvec[:, above_cutoff] ularge = X_matmat(vlarge) / slarge if self.return_singular_vectors != 'vh' else None vhlarge = _herm(vlarge) else: ularge = eigvec[:, above_cutoff] vhlarge = _herm(X_matmat(ularge) / slarge) if self.return_singular_vectors != 'u' else None u = _augmented_orthonormal_cols(ularge, nsmall) if ularge is not None else None vh = _augmented_orthonormal_rows(vhlarge, nsmall) if vhlarge is not None else None indexes_sorted = np.argsort(s) s = s[indexes_sorted] if u is not None: u = u[:, indexes_sorted] if vh is not None: vh = vh[indexes_sorted] return u, s, vh def _augmented_orthonormal_cols(U, n): if U.shape[0] <= n: return U Q, R = np.linalg.qr(U) return Q[:, :n] def _augmented_orthonormal_rows(V, n): if V.shape[1] <= n: return V Q, R = np.linalg.qr(V.T) return Q[:, :n].T def _herm(x): return np.conjugate(x.T) 将上述代码修改为使用LM,迭代器使用arpack
将代码修改为使用LM和迭代器使用arpack的方法如下:
```python
class SVDRecommender:
def __init__(self, k=50, ncv=None, tol=0, which='LM', v0=None, maxiter=None, return_singular_vectors=True, solver='arpack'):
self.k = k
self.ncv = ncv
self.tol = tol
self.which = which
self.v0 = v0
self.maxiter = maxiter
self.return_singular_vectors = return_singular_vectors
self.solver = solver
def svds(self, A):
if self.which == 'LM':
largest = True
elif self.which == 'SM':
largest = False
else:
raise ValueError("which must be either 'LM' or 'SM'.")
if not (isinstance(A, LinearOperator) or isspmatrix(A) or is_pydata_spmatrix(A)):
A = np.asarray(A)
n, m = A.shape
if self.k <= 0 or self.k >= min(n, m):
raise ValueError("k must be between 1 and min(A.shape), k=%d" % self.k)
if isinstance(A, LinearOperator):
if n > m:
X_dot = A.matvec
X_matmat = A.matmat
XH_dot = A.rmatvec
XH_mat = A.rmatmat
else:
X_dot = A.rmatvec
X_matmat = A.rmatmat
XH_dot = A.matvec
XH_mat = A.matmat
dtype = getattr(A, 'dtype', None)
else:
if n > m:
X_dot = X_matmat = A.dot
XH_dot = XH_mat = _herm(A).dot
else:
XH_dot = XH_mat = A.dot
X_dot = X_matmat = _herm(A).dot
dtype = A.dtype
def matvec_XH_X(x):
return XH_dot(X_dot(x))
def matmat_XH_X(x):
return XH_mat(X_matmat(x))
XH_X = LinearOperator(matvec=matvec_XH_X, dtype=dtype, matmat=matmat_XH_X, shape=(min(A.shape), min(A.shape)))
# 获得隐式定义的格拉米矩阵的低秩近似。
eigvals, eigvec = eigsh(XH_X, k=self.k, tol=self.tol ** 2, maxiter=self.maxiter, ncv=self.ncv, which=self.which, v0=self.v0, mode=self.solver)
# 格拉米矩阵有实非负特征值。
eigvals = np.maximum(eigvals.real, 0)
# 使用来自pinvh的小特征值的复数检测。
t = eigvec.dtype.char.lower()
factor = {'f': 1E3, 'd': 1E6}
cond = factor[t] * np.finfo(t).eps
cutoff = cond * np.max(eigvals)
# 获得一个指示哪些本征对不是简并微小的掩码,
# 并为阈值奇异值创建一个重新排序数组。
above_cutoff = (eigvals > cutoff)
nlarge = above_cutoff.sum()
nsmall = self.k - nlarge
slarge = np.sqrt(eigvals[above_cutoff])
s = np.zeros_like(eigvals)
s[:nlarge] = slarge
if not self.return_singular_vectors:
return np.sort(s)
if n > m:
vlarge = eigvec[:, above_cutoff]
ularge = X_matmat(vlarge) / slarge if self.return_singular_vectors != 'vh' else None
vhlarge = _herm(vlarge)
else:
ularge = eigvec[:, above_cutoff]
vhlarge = _herm(X_matmat(ularge) / slarge)
if self.return_singular_vectors != 'u':
u = _augmented_orthonormal_cols(ularge, nsmall) if ularge is not None else None
else:
u = None
if self.return_singular_vectors != 'vh':
vh = _augmented_orthonormal_rows(vhlarge, nsmall) if vhlarge is not None else None
else:
vh = None
indexes_sorted = np.argsort(s)
s = s[indexes_sorted]
if u is not None:
u = u[:, indexes_sorted]
if vh is not None:
vh = vh[index_sorted]
return u, s, vh
def _augmented_orthonormal_cols(U, n):
if U.shape[0] <= n:
return U
Q, R = np.linalg.qr(U)
return Q[:, :n]
def _augmented_orthonormal_rows(V, n):
if V.shape[1] <= n:
return V
Q, R = np.linalg.qr(V.T)
return Q[:, :n].T
def _herm(x):
return np.conjugate(x.T)
```
阅读全文