在编写熵值法代码的时候,发现代码算出的结果和EXCEL手动计算的结果存在细微差异,排查了很久,终于发现问题
def Entropy (data):
df3 = data
df4 = data
for index, row in data.iteritems():
indexSum = data[index].sum()
for i in range(0,len(row)):
if data[index][i] == 0:
lnfij2 = 0.0
else:
p2 = data[index][i] / indexSum
#注:第一次熵值法0。00001可以不加,第二次必须要加;第一次到底加不加看后期模型效果
lnfij2 = math.log(p2+ 0.00001) * p2 * (-k)
df4[index][i] = p2
df3[index][i] = lnfij2
# 计算冗余度
E = df3
d = 1 - E.sum(axis=0)
return d, df4
d, p = Entropy(df2)
在对df3和df4初始化的时候,目的是为了创建和data一样结果的dataframe,但这样仅仅只是引用传递,内存中并没有开辟新的空间,即df3、df4、data最终指向的是一个dataframe。如下:三个内存地址是一样的
print('df3的内存地址:'+ str(id(df3)))
print('df4的内存地址:'+ str(id(df4)))
print('data的内存地址:'+ str(id(data)))
>>df3的内存地址:2596589110608
>>df4的内存地址:2596589110608
>>data的内存地址:2596589110608
正确代码写法应改为
def Entropy (data):
df3 = pd.DataFrame(data = None, columns = data.columns, index = data.index)
df4 = pd.DataFrame(data = None, columns = data.columns, index = data.index)
for index, row in data.iteritems():
indexSum = data[index].sum()
for i in range(0,len(row)):
if data[index][i] == 0:
lnfij2 = 0.0
else:
p2 = data[index][i] / indexSum
#注:第一次熵值法0。00001可以不加,第二次必须要加;第一次到底加不加看后期模型效果
lnfij2 = math.log(p2+ 0.00001) * p2 * (-k)
df4[index][i] = p2
df3[index][i] = lnfij2
# 计算冗余度
E = df3
d = 1 - E.sum(axis=0)
return d, df4
d, p = Entropy(df2)
这样才是开辟了新的内存存放df3、df4