我对动态类型语言有问题,而且我经常担心类型。
Numpy有不同的行为,取决于某个事物是一个矩阵,一个普通的ndarray,还是一个列表。最初我没有所有这些断言,但我在尝试调试类型错误时插入了这些断言。
from numpy import *
sigmoid = vectorize(lambda(x): 1.0/(1.0+exp(-x)))
def prob_hOn_givenV (v,b,w):
assert isinstance(v,matrix)
assert isinstance(w,matrix)
assert isinstance(b,matrix)
assert shape(v)[1]==shape(w)[0]
#print("|v|="+str(shape(v)) +"|w|="+str(shape(w)) )
return sigmoid(b+v*w) #sum up rows (v is a column vector)
def prob_vOn_givenH (h,a,w):
assert isinstance(h,matrix)
assert isinstance(a,matrix)
assert isinstance(w,matrix)
assert shape(h)[1]==shape(w.T)[0]
return sigmoid(a+h*w.T) #sum up columns. (h is a row vector)有更好的办法吗?也许是一个防御性的编程工具包?代码中也有重复,但我看不到在保留意义的同时删除它的好方法。熟悉受限Boltzman机器的人士将认识到吉布斯抽样用于对比发散的条件公式。
发布于 2014-01-13 11:17:48
首先,我建议完全避免使用matrix类型。它所造成的问题超过了它所提供的小的句法上的方便,在我(和其他许多人)看来。
第二,在numpy中执行此类操作的惯用方法不是断言输入是特定类型,而是将它们强制到ndarray中。np.asarray()有效地做到了这一点;如果输入是ndarray,则输入不受影响地通过;如果它是ndarray子类,那么将创建一个新的ndarray,但只作为原始数据的视图,这样就不会复制数据。
import numpy as np
def sigmoid(x):
# No need to use vectorize() for this. It's already vectorized.
return 1.0 / (1.0 + np.exp(-x))
def prob_hOn_givenV(v, b, w):
v = np.asarray(v)
b = np.asarray(b)
w = np.asarray(w)
# Don't bother checking the shape. `np.dot()` will do that for us.
# Strictly speaking, the `asarray(v)` and `asarray(w)` aren't necessary
# since `np.dot(v, w)` already does that internally. But it does no harm.
return sigmoid(b + np.dot(v, w))发布于 2014-01-13 14:13:59
这些都是进行各种检查的仿生方法的最佳链接:
您可以使用特定的断言集(或用于更复杂的检查的任何其他代码,例如,检查一个ints列表是否真正包含所有ints)作为函数,然后使用该函数作为装饰器的参数,对正在检查的内容进行非常清晰的描述。
接受/返回修饰器是一种快速、干净的检查输入的方法。前后条件检查装饰器更适合用于更大或更复杂的检查集,无论是类型强制执行,还是参数范围,或者数据之间的任何其他关系,比如数组的元素被排序。
我过去常常只在函数中包含所有这些检查,但是对于某些函数,它会使代码变得不可读,因为真正的功能在所有检查中都会丢失。这是一个非常简单的方法来组织您的检查,并使您的代码更容易阅读。
+1不信任鸭子打字;)
https://codereview.stackexchange.com/questions/39125
复制相似问题