2017-05-31 149 views
0

我編寫了一個程序,該程序讀取一個CSV文件並計算兩列之間的相關性。問題是尋找相關性的標準方法在曲線和其他非線性函數上不起作用。是否有其他功能或簡單的方法來修改數據以確定相關性?以下是我的代碼,csv輸入和當前輸出。查找numpy.corr()的非線性函數的相關性

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'] 

回答

1

一般的答案

的相關係數是根據定義,一個線性擬合。我想你想要的是某種曲線擬合方式。問題是你必須通過手工或編程實驗來找到一個合適的。此外,這些不提供直接同源於相關係數,儘管最小平方誤差可以很容易地用於此目的。

特定應用

給定的情況下是一個簡單的 「V形」 的形狀;您需要對自變量(Temp)進行非線性轉換以獲得更好的擬合:X <= abs(X-56)。現在你有一個完美的關聯。

如果你想要一個程序來測試各種擬合併爲每個任意數據集派生出最好的一個,那麼恐怕你必須自己編寫外殼。然而,許多包(如SciKit),它們提供的功能優化一套具有給定誤差函數的方程。如果你想解決更大的項目,你可能想研究這些設施。

在此期間,也許一個簡單的繪圖功能可以幫助您縮小您的特定需求的領域?

1

嘗試使用元素明智的相關方法;遍歷曲線的所有元素並找出每對的相關值。 然後,您可以將相關的值平均爲一個值,該值將指示您處於高,中,低或無關聯狀態。