找到numpy.corr()的非线性函数的相关性

时间:2017-05-31 22:46:33

标签: python numpy

我编写了一个程序,它读取CSV文件并计算两列之间的相关性。问题是找到相关的标准方法对曲线和其他非线性函数不起作用。是否有其他功能或简单的方法来修改数据以确定相关性?下面是我到目前为止的代码,csv输入和当前输出。

def findCorrelation(csvFileName):
    data = pd.read_csv(csvFileName)
    data = data.values
    df = pd.DataFrame(data=data)
    npList = np.asarray(df)
    np2 = npList.astype(float)
    df2 = pd.DataFrame(data=np2)
    corr = df2.corr()
    corr = corr.values
    return corr[0][1]

def correlationMeaning(corr):
    if corr == 1:
        return ['perfect', 'positive', str(corr)]
    elif corr > 0.9:
        return ['high', 'positive', str(corr)]
    elif corr > 0.5:
        return ['medium', 'positive', str(corr)]
    elif corr > 0.1:
        return ['low', 'positive', str(corr)]
    elif corr > -0.1:
        return ['no', str(corr)]
    elif corr > -0.5:
        return ['low', 'negative', str(corr)]
    elif corr > -0.9:
        return ['medium', 'negative', str(corr)]
    elif corr > -1:
        return ['high', 'negative', str(corr)]
    elif corr == -1:
        return ['perfect', 'negative', str(corr)]
    else:
        return ['error']

print correlationMeaning(findCorrelation('CurveData.csv'))

CSV输入:

Temp,Sales
30,50
34,52
38,54
42,56
46,58
50,60
54,62
58,62
62,60
66,58
70,56
74,54
78,52
82,50

输出:

['no', '0.0']

2 个答案:

答案 0 :(得分:2)

一般答案

根据定义,相关系数是线性拟合。我认为你想要的是某种曲线拟合方式。问题是你必须通过手工或编程方式进行实验,以找到合适的方法。

此外,这些并未提供与相关系数的直接同源,尽管可以很容易地利用最小二乘误差来达到此目的。

特定应用

给定的案例是一个简单的" vee"形状;你需要对你的自变量(Temp)进行非线性变换才能得到很好的拟合:$sort。现在你有完美的相关性。

如果你想让一个程序试验各种拟合并为每个任意数据集得到最好的一个,那么你必须自己编写外壳程序,我很害怕。但是,许多包(例如SciKit),它们为具有给定误差函数的一组方程提供优化的功能。如果您想要处理更大的项目,您可能想要研究这些设施。

与此同时,也许一个简单的绘图功能可以帮助您缩小字段以满足您的特定需求?

答案 1 :(得分:1)

使用逐个元素的方法尝试相关方法;遍历曲线的所有元素并找到每对的相关值。 然后,您可以将相关值平均为一个值,该值将指示您是处于高,中,低还是无关联。