问题描述
我正在尝试计算高斯概率,但是当我通过数据运行它时,我得到ZeroDivisionError: float division by zero
代码如下:
def GaussianProbability(x,mean,std):
exponent = math.exp(-(math.pow(x-mean,2)/(2*math.pow(std,2))))
return (1 / (math.sqrt(2*math.pi) * std)) * exponent
和完整的错误日志:
ZeroDivisionError Traceback (most recent call last)
<ipython-input-22-b3fd5204c6fa> in <module>
----> 1 precisions_PDZ1,MAP,recalls_PDZ1,fp_rates_PDZ1 = CV_results(PDZ1_graphs,PDZ1_targets,'undirected')
<ipython-input-14-044940745269> in CV_results(list_graphs,list_targets,network_type,multi)
7 for part in tqdm(range(5)):
8
----> 9 probabilities_0,predictions = prediction(list_graphs[part],list_targets[part],multi)
10
11 if recalls == [] and fp_rates == []:
<ipython-input-12-beeed13223ea> in prediction(graph,actual_edges,multi)
11
12 for i in tqdm(range(len(X_test))):
---> 13 prob = Classprobabilities(summaries,prob_class,X_test[i])
14 if (prob[0]+prob[1])==0:
15 # both probabilities are too low
<ipython-input-11-286b09a753e9> in Classprobabilities(summaries,x)
8 for i in range(len(classSummaries)): # for every attribute
9 mean,std = classSummaries[i]
---> 10 probabilities[classValue] *= GaussianProbability(x[i],std)
11
12 return probabilities
<ipython-input-10-4a13cc5a69b2> in GaussianProbability(x,std)
1 def GaussianProbability(x,std):
----> 2 exponent = math.exp(-(math.pow(x-mean,2))))
3 return (1 / (math.sqrt(2*math.pi) * std)) * exponent
ZeroDivisionError: float division by zero
解决方法
唯一可能发生这种错误的地方是(2*math.pow(std,2)) == 0
。
这意味着对于某些数据,std == 0
会在所有样本都具有完全相同的值时发生。
您需要处理这种情况!
除非您希望自己实施(不推荐),否则可以使用scipy
软件包:
import scipy
scipy.stats.norm(0,1).pdf(0)
您还可以使用python提供的内置统计信息包(更好,更简单的计算思路)。签出here
,当standerdv等于零时,您的函数需要有一个 ID. vector1 vector2 scalar
11.0 [0.34,0.56,0.99] [0.24,0.44] 9.0
23.0 [0.12,0.66,0.21] [0.21,0.24] 4.0
语句
您可以看到此参考书可能会What is the normal distribution when standard deviation is zero?