如何在两个2-D numpy数组之间执行线性/非线性回归并用matplotlib可视化?

时间:2014-06-30 03:42:01

标签: python numpy matplotlib

首先,我想澄清一下,我需要对特定大国的疾病和许多其他环境因素之间的数据进行回归,因此我有大量数据。

现在,我已将此数据存储在tiff个文件中,并通过numpy将其读入gdal数组。每个数据集都被读入numpy形状<54L,53L>数组。我为每个数据集都有几个这样的数组。我需要在这两个2-D numpy数组之间执行回归。数组中的值为Float64。这是一个例子:

[[ 162.32145691  158.19345093  153.15704346 ...,  123.77481079 123.63883972  123.6770401 ]
 [ 164.55152893  160.59266663  155.75968933 ...,  121.28504181  121.1164093  121.16275024] ..., 
 [ 321.38272095  329.53326416  338.85699463 ...,  193.69404602   192.50938416  191.42672729]]

像DiseaseDataset vs EnvironmentFactor1,DiseasDataset vs EnvironementFactor2等。由于关系相当未知,任意和复杂,我想首先绘制这些二维数组,但我找不到合适的方法。

那么如何在matplotlib 中的散点图中绘制二维数组?我说散点图因为我更容易推断出这种关系并转向适当的回归模型(线性,非线性,对数等)。我使用下面的代码来绘制每个numpy数组之间的行关系:

for i in range(55):
    plt.scatter(JanTemp[i],can02[i])    
    plt.title('Disease vs Temperature')
    plt.ylabel('DiseaseCases')
    plt.xlabel('Temp')
    plt.show()

此处can02是响应变量,JanTemp是预测变量。正如预期的那样,我得到了54个连续的图形和两个变量的相同颜色,这是令人沮丧的(这是我第一次使用matplotlib的经历,我不知道如何让每个变量都有自己的颜色)。 有更好的方法吗?如果是,请建议我认为这将是三维可视化,但那么我将如何从中推断?所以请建议一种在二维空间中可视化的方法,但比上面更好。

由于我无法从图中获得太多信息,因此我决定从线性回归开始。我按以下方式迭代地使用与上面类似的scipy.stats.linregress

months =[JanTemp,FebTemp,MarTemp1,AprTemp,MayTemp,JunTemp,JulTemp,AugTemp,SepTemp,OctTemp,NovTemp,DecTemp]
for month in months:
    csum=0
    pcsum=0
    for i in range(54):
            slope, intercept, r_value, p_value, std_err = stats.linregress(month[i],can02[i])
            csum +=r_value
            pcsum += (r_value**2)*100
    print "mean correlation coefficient is", csum/53
    print "The avg COD is", pcsum/53

此处JanTempFebTemp等是维度54,53的每个文件。对于每个文件,我正在进行行与行回归53次。这也很平凡。 是否有更好的方法,如功能,模块等?

我所知道的另一种方法是以下列方式使用statsmodels.api模块的普通最小二乘(OLS):

y = can02
x = JanTemp
X = sm.add_constant(x) #Adds a constant to the linear eq of regression
est = sm.OLS(y, X) #OLS performs the regression of predictor on response
est = est.fit() #fit object of OLS fits the mode
est.summary() #Gives the summary of whole calculation
est.params #gives the coefficient of regression

但我收到以下长错误:

Traceback (most recent call last):
  File "H:\Python\results.py", line 77, in <module>
est.summary() #Gives the summary of whole calculation
  File "C:\Python27\lib\site-packages\statsmodels\regression\linear_model.py", line 1230, in summary
top_right = [('R-squared:', ["%#8.3f" % self.rsquared]),
  File "C:\Python27\lib\site-packages\statsmodels\tools\decorators.py", line 95, in __get__
_cachedval = self.fget(obj)
  File "C:\Python27\lib\site-packages\statsmodels\regression\linear_model.py", line 959, in rsquared
return 1 - self.ssr/self.centered_tss
  File "C:\Python27\lib\site-packages\statsmodels\tools\decorators.py", line 95, in __get__
_cachedval = self.fget(obj)
  File "C:\Python27\lib\site-packages\statsmodels\regression\linear_model.py", line 931, in ssr
return np.dot(wresid, wresid)
ValueError: matrices are not aligned

我没有得到矩阵如何不对齐。无论如何,坚持我的原始问题,还有其他类似的方法来执行回归,我将如何在二维数组上进行 谢谢,我知道我在这个漫长的问题上花了很多宝贵的时间,但我想说清楚。我在本网站和其他网站上搜索了很多问题,但我找不到合适的或相关的解决方案。感谢。

1 个答案:

答案 0 :(得分:0)

你真的拥有轴位置,参数,年份的3D数据吗?那么这里的地理位置很少。

我认为问题根本不是numpy,而是如何分析数据。 (一旦你知道你想要什么,你可能会对pandas感兴趣。)

这类工作有一些非常复杂的统计方法,但您可以从一些简单的概念开始,就像使用线性回归一样。首先,你应该将因变量(结果,例如疾病)和自变量(例如温度)分开,并一次查看一个因变量。

一个简单的例子:只吃一种疾病。为此,您可以在M年内在N个地点获得案例数量。然后采取你拥有的所有P环境因素。现在,您可以计算疾病与所有P环境因素之间每个位置的时间序列相关性。这导致每N个位置的P数。

如果将其显示为图像(N行,P列),则可以查找高强度的列。它们代表疾病 - 环境因子对,似乎在许多地方重复。这不是一个统计上严格的方法,但它提供了一个快速概述。


我没有给出太多的代码示例,因为在进行任何可视化之前需要考虑统计基础。然后,可视化部分通常更容易。不幸的是,您所拥有的数据类型没有简单的可视化。

但对于散点图:http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter。例如,要绘制红色标记而不是蓝色标记:scatter(x, y, c='r')如果您只需要每个数据系列单色,您也可以使用plt.plot(x, y, 'r.')r定义颜色,{{1}我们想要单独的数据点。)