如何编码比例可变的方程式(此paper的方程式1)?
我的代码是:
import pandas as pd
l = pd.Series([1,2,3,4,5,6]) # any list of numbers
n = len(l)
if n > 1:
C = (n*(n-1))/2
D = []
for i in l.index:
for j in l.index:
if i != j:
zi_zj = [l[i],l[j]]
D.append(1-((min(zi_zj))/(max(zi_zj))))
PV = (1/C)*(np.sum(D))
else:
PV = 0
如果我将所有数字都相同的列表放入,则按预期方式得到
PV = 0
,但是如果我将一个具有算术序列的列表放入例如[0,2,4,6,8]
,PV = 1.4
,并且根据本文,PV
应该在0
和1
之间,并且算术序列的PV = 0.5
应当与样本大小n
独立。我尝试的另一个选择是:
l = pd.Series([1,2,3,4,5,6]) # any list of numbers
n = len(l)
if n > 1:
C = (n*(n-1))/2
i_s = set()
j_s = set()
D = []
for i in l.index:
for j in l.index:
if i != j:
if i not in i_s:
if j not in j_s:
zi_zj = [l[i],l[j]]
D.append(1-((min(zi_zj))/(max(zi_zj))))
i_s.add(i)
j_s.add(j)
PV = (1/C)*(np.sum(D))
else:
PV = 0
但也没有用。
另外,我在Python中找不到用于计算数字序列的比例变异性的函数。
谁能在代码中发现我做错的事情,或者让我知道是否有内置函数?
最佳答案
根据我所做的计算,值0.5
仅适用于较大的n
;请检查我是否弄错了(未详细检查纸张)。
import pandas as pd
from itertools import combinations
l = pd.Series(list(range(3)))
n = len(l)
C = n * (n - 1) / 2.
# get all pairs in l
pairs = list(combinations(l, 2))
因此,对如下所示:
[(0, 1), (0, 2), (1, 2)]
现在,当您已经使用熊猫时,我们可以将其存储在数据框中,这使得后续计算变得非常容易:
# store pairs in dataframe
df_pairs = pd.DataFrame(pairs).rename(columns={0: 'zi', 1: 'zj'})
# get max / min for each pair
max_val = df_pairs.max(axis=1)
min_val = df_pairs.min(axis=1)
df_pairs['max_z'] = max_val
df_pairs['min_z'] = min_val
# absolute difference between z
df_pairs['diff_z_abs'] = (df_pairs['zi'] - df_pairs['zj']).abs()
df_pairs['ratio_diff_max'] = df_pairs['diff_z_abs'] / df_pairs['max_z']
df_pairs['one_minus_ratio'] = 1. - df_pairs['min_z'] / df_pairs['max_z']
现在,数据框如下所示:
zi zj max_z min_z diff_z_abs ratio_diff_max one_minus_ratio
0 0 1 1 0 1 1.0 1.0
1 0 2 2 0 2 1.0 1.0
2 1 2 2 1 1 0.5 0.5
然后,值
PV
就是:PV = df_pairs['ratio_diff_max'].sum() / C
对于此示例,它是
0.83333333
,比0.5
高得多。但是,如果我们现在改变l = pd.Series(list(range(3)))
为更大的值,
PV
然后接近0.5
。例如,对于l = pd.Series(list(range(5000)))
我得到
0.500199
因此,它可能仅对
n
成立。关于python - 比例变异代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47840620/