如何计算相似度矩阵的均值和标准差?

时间:2019-06-17 01:45:41

标签: python pandas numpy dataframe similarity

我正在处理CSV文件,并且我有一个计算文档之间相似度的代码。 1帖子提供了代码和数据以及输出的详细信息,如下所示:

data.csv看起来是:

<iostream>

输出为:

<algorithm>

现在,我想在没有身份数据(100.0)的情况下计算相似度矩阵的下三角的均值和标准偏差(因为上和下都是相似的)。

我尝试将熊猫内置的mean和std用作:

#include <iostream>
#include <tuple>

using namespace std;

tuple<int, int> PARTITION(int *a, int p, int q)
{
    int i = p - 1;
    int j = q + 1;
    int t1 = p - 1;
    int t2 = q;

    int x = a[q];

    cout << t2 << endl;
    cout << j << endl;

    while (t1 < t2)
    {
        while ((t2 != j) && (t1 < t2))
        {
            ++t1;
            if (a[t1] < x)
                swap(a[t1], a[++i]);
            else if (a[t1] > x)
                swap(a[t1], a[--j]);
        }

        while ((t1 != i) && (t1 < t2))
        {
            --t2;
            if (a[t2] > x)
                swap(a[t2], a[--j]);
            else if (a[t2] < x)
                swap(a[t2], a[++i]);
        }
    }

    return tuple<int, int>(i, j);
}

void QSORT(int *a, int p, int q)
{
    if (p < q)
    {
        tuple<int, int> pos = PARTITION(a, p, q);
        QSORT(a, p, get<0>(pos));
        QSORT(a, get<1>(pos), q);
    }
}

int main()
{

    int a[] = {9, 21, 3, 2, 6, 7, 4, 55, 10};

    int len = sizeof(a) / sizeof(a[0]);

    QSORT(a, 0, len - 1);

    for (int i = 0; i < len; ++i)
        cout << a[i] << " ";

    cout << endl;
}

但这会考虑输出中的所有数据,例如恒等和上三角。

我想知道是否有任何方法可以按照我提到的方式计算平均值和标准偏差。

2 个答案:

答案 0 :(得分:2)

numpy.trilk=-1一起使用,并将np.nan设为0:

import numpy as np

ltri = np.tril(df.values, -1)
ltri = ltri[np.nonzero(ltri)]

输出:

array([[ 0.,  0.,  0.,  0.],
       [78.,  0.,  0.,  0.],
       [51., 47.,  0.,  0.],
       [50., 54., 83.,  0.]])

现在您可以执行ltri.std()ltri.mean()

ltri.std(), ltri.mean()
# (14.361406616345072, 60.5)

答案 1 :(得分:1)

您可以将所有不需要的值都屏蔽为np.nan

df.values[np.triu_indices_from(df.values,0)]=np.nan
df.mean()
112    59.666667
114    50.500000
115    83.000000
117          NaN
dtype: float64
df.std()
112    15.885003
114     4.949747
115          NaN
117          NaN
dtype: float64

屏蔽值之后

df
      112   114   115  117
112   NaN   NaN   NaN  NaN
114  78.0   NaN   NaN  NaN
115  51.0  47.0   NaN  NaN
117  50.0  54.0  83.0  NaN