如何编码比例可变的方程式(此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应该在01之间,并且算术序列的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/

10-10 21:39