码迷,mamicode.com
首页 > 其他好文 > 详细

线性回归自动分析

时间:2015-01-19 22:19:27      阅读:337      评论:0      收藏:0      [点我收藏+]

标签:

线性回归自动分析

By Toby:

QQ:231469242

 

欢迎共同爱好者交流,并改进代码。

本人用Python代码写出线性回归自动分析程序,秒杀。

程序包含残差函数,用于检测输入错误数据。

还包含r函数,可以把其它函数转换成一元线性。

此程序还可以用numpy改进,提高算法优越性。

 

简介:

线性回归可以对大数据进行分析和预测,数据量越大,预测越准。

适用于科学实验,生物数据分析,疾病关联性,独立性检验等等

 

 

 

#目录:

#1.单词

#2.排列函数:def A(a,b)

#3.组合函数:def C(a,b)

#4.概率

#5.利润

#6.Bernoulli distribution 两点分布

#7.Binomial distribution 二项式分布

#8.hypergeometric distribution 超几何分布

#9.数学期望值 mathematical expectation

#10.方差 variance

#11.标准差 standard deviation

#12.正太分布 normal distribution

#13.独立性检验test for independence

#14.一元线性回归

  #r^2自动判断模型是否合适

  #residual判断错误值

  #其它函数转换成一元线性回归

 

 

 

#1.单词

#排列permutation,组合combination,阶乘factorial  概率probability

 

import math,pylab,numpy

#2.排列函数

#a,b,number,total are all numbers

def A(a,b):

    # b>=a

    return math.factorial(b)/math.factorial(b-a)

 

 

#3.组合函数

def C(a,b):

    # b>=a

    return math.factorial(b)/(math.factorial(b-a)*math.factorial(a))

 

#4.概率

def probability(number,total):

    return round(number/float(total),8)

    

 

#5.利润

def profit(gain,cost):

    return gain-cost

 

 

#6.Bernoulli distribution 两点分布

#p表示成功概率,q表示失败概率

#返回成功概率

#p概率必须小于等于1

def Bernoulli_distribution(p):

    if p<=1:

        return p

    else:

        print "proberbility must less or equal than 1"

 

 

#7.Binomial distribution 二项式分布

# n表示实验次数

# x表示成功次数

# p表示成功概率

#必须是独立事件

def Binomial_distribution(n,x,p):

    if p <=1:

        return C(x,n)*(p**x)*((1-p)**(n-x))

    else:

        print "proberbility must less or equal than 1"

 

    

#8.hypergeometric distribution 超几何分布

#total 表示样品总数

# class_1 表示某类样品数量

# getout 表示取出数量总数

# class_1_out 取出某类样品数量

 

 

def hypergeometric_distribution(total,class_1,getout,class_1_out):

    

    return C(class_1_out,class_1)*C((getout-class_1_out),(total-class_1))/float(C(getout,total))

           

    

 

#9.数学期望值 mathematical expectation

#0)标准型

#概率输入规范1/6写成1.0/6

#日后改进list_probability=[1.0/len(list_variable)]*len(list_variable)

def Expectation(list_variable,list_probability):  

    if len(list_variable)!=len(list_probability):

        print "input erro"

        

    expectation=0

    for i in range(len(list_variable)):

        sum1=list_variable[i]*float(list_probability[i])

        expectation+=sum1

 

    return expectation

    

    

    

#(0.1)标准型--随机变量系数性

#Y=aX+b,a,b为常数,则E(aX+b)=aE(X)+b

def Expectation_ratio(expectation,a,b):

    return a*expectation+b

    

    

 

 

#(1)两点分布数学期望值

def Expectation_Bernoulli_distribution(p):

    return p

 

#(2)两项分布数学期望值

def Expectation_Binomial_distribution(n,p):

    return n*p

 

#(3)超几何分布数学期望值

def Expectation_hypergeometric_distribution(total,class_1,getout):

    return (float(class_1)/total)*getout

    

 

 

 

#10.方差和标准差 variance standard deviation

#0)标准方差

def variance(list_variable,list_probability):

    variance_num=0

    expectation_num=Expectation(list_variable,list_probability)

    for i in range(len(list_variable)):

        sum1=((list_variable[i]-expectation_num)**2)*float(list_probability[i])

        variance_num+=sum1

 

 

    return variance_num

        

#(0.1)标准差——系数版本

#Y=aX+b,a,b为常数,则D(aX+b)=a**2*D(X)

def variance_ratio(variance_value,a,b):

    return (a**2)*variance_value

    

 

 

#(1)两点分布的方差

def variance_Bernoulli_distribution(p):

    return p*(1-p)

 

#2)二项式分布的方差

def variance_Binomial_distribution(n,p):

    return n*p*(1-p)

 

#3)超几何分布的方差

 

def variance_hypergeometric_distribution(total,class_1,getout):

    return ((getout*class_1)/float(total))*(1-class_1/float(total))*((total-getout)/float((total-1)))

 

 

 

 

#11.标准差 standard deviation

#(0)一般标准差

def deviation(list_variable,list_probability):

    variance_num=variance(list_variable,list_probability)

    return math.sqrt(variance_num)

    

    

 

 

#(1)两点分布的标准差

def deviation_Bernoulli_distribution(p):

    return math.sqrt(p*(1-p))

 

#2)二项式分布的标准差

def deviation_Binomial_distribution(n,p):

    return math.sqrt(n*p*(1-p))

 

 

#(3)超几何分布的标准差

def deviation_hypergeometric_distribution(total,class_1,getout):

    variance=variance_hypergeometric_distribution(total,class_1,getout)

    return math.sqrt(variance)

    

 

 

 

#12.正太分布 normal distribution

#u代表期望值,均值

#q代表标准差

#返回的是概率值

def normal_distribution(x,u,q):

    return (1.0/((math.sqrt(2*math.pi))*q))*(math.e**((-(x-u)**2)/(2*(q**2))))

 

 

 

#转换公式x=(x-u)/q

#x=round(x,1) 近似值0.1

def normal_distribution_area(x,u,q):

    x=(x-u)/q

    x=round(x,1)

    

    if 2.4<=x<=3 or x>3:

        return 0.99

 

    if 2.1<=x<=2.3:

        return 0.98

 

    if 1.9<=x<=2.0:

        return 0.97

 

 

    if x==1.8:

        return 0.96

 

    if x==1.7:

        return 0.95

 

    if x==1.6:

        return 0.94

 

    if x==1.5:

        return 0.93

 

    if x==1.4:

        return 0.92

 

    if x==1.3:

        return 0.9

 

    if x==1.2:

        return 0.88

 

    if x==1.1:

        return 0.86

 

    if x==1.0:

        return 0.84

    if x==0.9:

        return 0.82

    if x==0.8:

        return 0.79

    if x==0.7:

        return 0.76

    if x==0.6:

        return 0.73

    if x==0.5:

        return 0.7

    if x==0.4:

        return 0.65

    if x==0.3:

        return 0.62

 

    if x==0.2:

        return 0.58

    if x==0.1:

        return 0.54

    if x==0:

        return 0.5

 

    if x<0:

        return 1-normal_distribution_area(-x,u,q)

 

    

 

 

#13.独立性检验test for independence

#2.706是判断标准,值越大,越有关,值越小,越无关

def value_independence(a,b,c,d):

    return ((a+b+c+d)*(a*d-b*c)**2)/float((a+b)*(c+d)*(a+c)*(b+d))

 

#返回True表示有关

#返回False表示无关

def judge_independence(num_independence):

    if num_independence>2.706:

        return True

    else:

        return False

 

    

 

#14.一元线性回归

 

    

 

#s_xy=(x1*x2+y1*y2+.....x_n*y_n)/n-mean(x)*mean(y)

#平均值函数

def mean(sample_list):

    sum=0

    for i in sample_list:

        sum+=i

 

    mean_value=float(sum)/len(sample_list)

    return mean_value

 

#s_x表示{x_i}的标准差

def s_deviation(sample_list):

    mean_value=mean(sample_list)

    s_deviation_value=0

    for i in range(len(sample_list)):

        sum1=((sample_list[i]-mean_value)**2)

        s_deviation_value+=sum1

 

    s_deviation_value=float(s_deviation_value)/len(sample_list) #除以个数,得平均值

    s_deviation_value=math.sqrt(s_deviation_value) #开平方,得到标准差

    

    

    return s_deviation_value

 

def s_xy(list_x,list_y):

    x_mean=mean(list_x)

    y_mean=mean(list_y)

 

    if len(list_x)!=len(list_y):

        print "erro"

 

    s_xy=0

    total=0

    for i in range(len(list_x)):

        sum1=list_x[i]*list_y[i]

        total+=sum1

    s_xy=(float(total)/len(list_x))-(x_mean*y_mean)

    

 

    return s_xy

 

 

 

def r_xy(s_xy_value,s_x,s_y):

    

    r_xy_value=float(s_xy_value)/(s_x*s_y)

    #r_xy_value=round(r_xy_value,5)  #保留五位小数

    return r_xy_value

 

 

 

 

#线性回归模式

def linear_b(s_xy_value,s_x):

    

    b=s_xy_value/s_x**2

    #b=round(b,4)

    return b

    

    

def linear_a(b,x_mean,y_mean):

    a=y_mean-b*x_mean

    #a=round(a,4)

    return a

 

 

#数据处理

#列表值取对数,生成新列表

def log_sample(sample_list):

    new_list=[]

    for i in sample_list:

        value=math.log(i,math.e)

        new_list.append(value)

 

    return new_list

 

#列表值取平方,生成新列表

def square(sample_list):

    new_list=[]

    for i in sample_list:

        value=i**2

        new_list.append(value)

 

    return new_list

    

#列表值取负倒数,生成新列表

def  negative_reciprocal(sample_list):

    new_list=[]

    for i in sample_list:

        value=-1.0/i

        new_list.append(value)

 

    return new_list

 

 

#列表元素取绝对值,生成新列表

def absolute(sample_list):

    new_list=[]

    for i in sample_list:

        value=math.fabs(i)

        new_list.append(value)

 

    return new_list

 

    

#预算将来值

def forecast_linear(b,a,forecast_x,mode):

    #mode采用不同计算模式

    y_forecast=0

    if mode=="linear":

        y_forecast=b*forecast_x+a

 

    if mode==2:

        y_forecast=a*(forecast_x**b)

 

    if mode==3:

        y_forecast=a*(math.e**(b*forecast_x))

 

    if mode==5:

        y_forecast=a*(math.e**(float(-b)/forecast_x))

 

    if mode==6:

        y_forecast=(b*forecast_x**2)+a

    

    #y_forecast=round(y_forecast,0)#不保留小数

    #y_forecast=int(y_forecast) #取整数

    

    return y_forecast    

 

 

#绘制一元线性分布图

def draw_linear_regression_model(list_x,list_y,b,a,mode):

    #list_xlist_y是绘制点的xy值集合,b,a是参数,mode是绘制模式

    #绘制点分布

    pylab.plot(list_x, list_y,‘ro‘)  #‘ro‘表示绘制点

 

    #x取值范围智能化

    #x_min=min(list_x)  x=min(list_total)/1.5

    x_max=max(list_x)*1.5

    x=numpy.arange(0.01,x_max)  #x取值范围可以随意更改

 

    #绘制类型选择

    if mode=="linear":

        y=b*x+a

 

    if mode==2:

        y=a*(x**b)

 

    if mode==3:

        y=a*math.e**(b*x)

 

    if mode==5:

        y=a*math.e**(float(-b)/x)

        

    if mode==6:

        y=(b*x**2)+a

 

    

    pylab.plot(y)

    

    # Pad margins so that markers don‘t get clipped by the axes,让点不与坐标轴重合

    pylab.margins(0.3)

    pylab.grid(True)

 

    pylab.title("linear regression model")

 

    pylab.show() 

 

 

 

 

    

#程序后期检验工作

#建模线性回归方程后,算出y的近似值

def linear_y(b,a,list_x,mode):

    list_linear_y=[]

    for i in list_x:

        value=forecast_linear(b,a,i,mode)

        list_linear_y.append(value)

 

    return list_linear_y

        

   

 

 

#计算residual残差列表

def residual(list_y,list_linear_y):

    residual_list=[]

    for i in range(len(list_y)):

        value=list_y[i]-list_linear_y[i]

        residual_list.append(value)

 

    return residual_list

 

 

#根据residual残差检验数据错误

def wrongNumber_check(list_x,list_y,residual_list):

    #预测不准确残差值

    wrongNumber_predict=[]

    

    #点元组为元素,生成列表

    list_dot=zip(list_x,list_y)

    

    #残差和点为元素,组成列表

    list_residual_dot=zip(residual_list,list_dot)

    dict_residual_dot=dict(list_residual_dot)

    

    #判断标准benchmark

    absolute_residual_list=absolute(residual_list)

    benchmark=1.5*mean(absolute_residual_list)

 

 

    #遍历残差值,如果残差绝对值大于标准值,则对应的点添加到错值预测列表

    for i in residual_list:

        if math.fabs(i)>benchmark:

            wrongNumber=dict_residual_dot[i]

            wrongNumber_predict.append(wrongNumber)

 

    print"wrongNumber prediction:",wrongNumber_predict

 

    return wrongNumber_predict

        

        

 

 

#绘制残点图

def draw_residual(residula_list):

    x=[i for i in range(1,len(residula_list)+1)]

    y=residula_list

    pylab.plot(x,y,‘ro‘)

    pylab.title("draw residual to check wrong number")

    

    # Pad margins so that markers don‘t get clipped by the axes,让点不与坐标轴重合

    pylab.margins(0.3)

 

    #绘制网格

    pylab.grid(True)

 

    pylab.show()

    

 

#r的平方可以判断模型是否合适,r的平方值越大,越合适,反之亦然

def r_estimate(r_xy_value):

    if r_xy_value**2>0.8:

        return True

    else:

        return False

 

 

#计算linear mode R

def mode_linear(list_x,list_y):

    #x平均数

    x_mean=mean(list_x)

    #y平均数

    y_mean=mean(list_y)

    #list_x的标准差

    s_x=s_deviation(list_x)

    #list_y的标准差

    s_y=s_deviation(list_y)

    s_xy_value=s_xy(list_x,list_y)

    #r_xy_value{x_i}{y_i}的相关系数

    r_xy_value=r_xy(s_xy_value,s_x,s_y)

    #计算R平方

    R_square=r_xy_value**2

 

    return R_square

 

def mode_2(list_x,list_y):

    #输入两个列表取对数,生成两个新列表

    log_list_x=log_sample(list_x)

    log_list_y=log_sample(list_y)

 

    #对两个新列表取平均数

    x_mean=mean(log_list_x)

    y_mean=mean(log_list_y)

 

    #对两个新列表算标准差

    s_x=s_deviation(log_list_x)

    s_y=s_deviation(log_list_y)

    s_xy_value=s_xy(log_list_x,log_list_y)

 

    #r_xy_value{x_i}{y_i}的相关系数

    r_xy_value=r_xy(s_xy_value,s_x,s_y)

 

    #计算R平方

    R_square=r_xy_value**2

 

    return R_square

 

 

def mode_3(list_x,list_y):

    #y列表取对数,生成新列表

    log_list_y=log_sample(list_y)

 

    #对两个新列表取平均数

    x_mean=mean(list_x)

    y_mean=mean(log_list_y)

 

    #对两个新列表算标准差

    s_x=s_deviation(list_x)

    s_y=s_deviation(log_list_y)

    s_xy_value=s_xy(list_x,log_list_y)

 

    #r_xy_value{x_i}{y_i}的相关系数

    r_xy_value=r_xy(s_xy_value,s_x,s_y)

 

    #计算R平方

    R_square=r_xy_value**2

 

    return R_square

 

 

def mode_5(list_x,list_y):

    

    #y列表取对数,生成新列表

    negative_reciprocal_x=negative_reciprocal(list_x)

    log_list_y=log_sample(list_y)

    #for test

    #print"negative_reciprocal_x:",negative_reciprocal_x

    #print"log_list_y",log_list_y

 

    #对两个新列表取平均数

    x_mean=mean(negative_reciprocal_x)

    y_mean=mean(log_list_y)

 

    #对两个新列表算标准差

    s_x=s_deviation(negative_reciprocal_x)

    s_y=s_deviation(log_list_y)

    s_xy_value=s_xy(negative_reciprocal_x,log_list_y)

 

    #r_xy_value{x_i}{y_i}的相关系数

    r_xy_value=r_xy(s_xy_value,s_x,s_y)

 

    #计算R平方

    R_square=r_xy_value**2

 

    return R_square

 

 

 

def mode_6(list_x,list_y):

    #x列表取平方数

    square_list_x=square(list_x)

    

    #x平均数

    x_mean=mean(square_list_x)

    #y平均数

    y_mean=mean(list_y)

    #list_x的标准差

    s_x=s_deviation(square_list_x)

    #list_y的标准差

    s_y=s_deviation(list_y)

    s_xy_value=s_xy(square_list_x,list_y)

    #r_xy_value{x_i}{y_i}的相关系数

    r_xy_value=r_xy(s_xy_value,s_x,s_y)

 

    #计算R平方

    R_square=r_xy_value**2

 

    return R_square

 

 

 

 

#mode函数模型自动判断

def mode_choose(list_x,list_y,mode_list):

    #初始化值

    #R平方列表,采用最大值对应mode

    R_square_list=[]

    best_mode=0

    R_square=0

 

    #计算R_square_list

    for i in mode_list:

        mode=i

        if mode=="linear":

            R_square=mode_linear(list_x,list_y)

            R_square_list.append(R_square)

 

        if mode==2:

            R_square=mode_2(list_x,list_y)

            R_square_list.append(R_square)

 

        if mode==3:

            R_square=mode_3(list_x,list_y)

            R_square_list.append(R_square)

 

        if mode==5:

            R_square=mode_5(list_x,list_y)

            R_square_list.append(R_square)

            

        if mode==6:

            R_square=mode_6(list_x,list_y)

            R_square_list.append(R_square)

 

    best_R_square=max(R_square_list)

 

    dict_R_mode=dict(zip(R_square_list,mode_list))

    print"dict:R^2 and mode",dict_R_mode

 

    best_mode=dict_R_mode[best_R_square]

 

    return best_mode

 

 

 

 

 

def print_out(x_mean,y_mean,s_x,s_y,s_xy_value,r_xy_value,r_estimate_value,\

              b,a,forecast_value,wrongNumber_Predict,mode):

    print "x_mean:",x_mean

    print "y_mean:",y_mean

    print "s_x:",s_x

    print "s_y:",s_y

    print "s_xy_value:",s_xy_value

    print "r_xy_value:",r_xy_value

    print "r_estimate_value:",r_estimate_value

    print "b:",b

    print "a:",a

    print "forecast_value:",forecast_value

    print "wrongNumber_Predict:",wrongNumber_Predict

    print "the best mode:",mode

 

 

 

 

#一元线性主函数

def main_linear_regression(list_x,list_y,forecast_x,mode):

    

    #x平均数

    x_mean=mean(list_x)

    #y平均数

    y_mean=mean(list_y)

    #list_x的标准差

    s_x=s_deviation(list_x)

    #list_y的标准差

    s_y=s_deviation(list_y)

    s_xy_value=s_xy(list_x,list_y)

    #r_xy_value{x_i}{y_i}的相关系数

    r_xy_value=r_xy(s_xy_value,s_x,s_y)

    #如果r绝对值大,则可用线性方程表示

    r_estimate_value=r_estimate(r_xy_value)

    #线性方程的系数值

    b=linear_b(s_xy_value,s_x)

    #线性方程与y轴截距值

    a=linear_a(b,x_mean,y_mean)

 

    forecast_value=forecast_linear(b,a,forecast_x,mode)

 

    #计算y的近似值

    list_linear_y=linear_y(b,a,list_x,mode)

    #计算残差值

    residual_list=residual(list_y,list_linear_y)

 

    wrongNumber_Predict=wrongNumber_check(list_x,list_y,residual_list)

 

    #标准输出

    print_out(x_mean,y_mean,s_x,s_y,s_xy_value,r_xy_value,r_estimate_value,\

              b,a,forecast_value,wrongNumber_Predict,mode)

 

    #绘制一元线性回归图

    draw_linear_regression_model(list_x,list_y,b,a,mode)

    #绘制残差图

    draw_residual(residual_list)

 

 

 

 

#15.y=a*x**b)转换为一元线性回归

#算法:两边去自然对数,lny=lna*x**b=lna+b*lnx

#y‘=lny,a‘=lna, x‘=lnx

#原式转换为 y‘=b*x‘+a‘

#利用函数log_samplex,y,计算出y‘x‘

#再利用y‘x‘算出ba‘

#再利用a‘算出a

#最后利用a,b, 得到y=a*x**b解析式

 

#主函数

def main_mode2_regression(list_x,list_y,forecast_x,mode):

    #输入两个列表取对数,生成两个新列表

    log_list_x=log_sample(list_x)

    log_list_y=log_sample(list_y)

 

    #对两个新列表取平均数

    x_mean=mean(log_list_x)

    y_mean=mean(log_list_y)

 

    #对两个新列表算标准差

    s_x=s_deviation(log_list_x)

    s_y=s_deviation(log_list_y)

    s_xy_value=s_xy(log_list_x,log_list_y)

 

    #r_xy_value{x_i}{y_i}的相关系数

    r_xy_value=r_xy(s_xy_value,s_x,s_y)

    #如果r绝对值大,则可用线性方程表示

    r_estimate_value=r_estimate(r_xy_value)

 

    #线性方程的系数值

    b=linear_b(s_xy_value,s_x)

    #线性方程与y轴截距值

    exponent_a=linear_a(b,x_mean,y_mean)

    a=math.e**exponent_a

    forecast_value=forecast_linear(b,a,forecast_x,mode)

 

    #计算y的近似值

    list_linear_y=linear_y(b,a,list_x,mode)

    #计算残差值

    residual_list=residual(list_y,list_linear_y)

 

    wrongNumber_Predict=wrongNumber_check(list_x,list_y,residual_list)

 

    #标准输出

    print_out(x_mean,y_mean,s_x,s_y,s_xy_value,r_xy_value,r_estimate_value,\

              b,a,forecast_value,wrongNumber_Predict,mode)

 

    #绘制一元线性回归图

    draw_linear_regression_model(list_x,list_y,b,a,mode)

    #绘制残差图

    draw_residual(residual_list)

    

 

 

  

#16.y=a*e**(b*x)转换为一元线性回归,mode=3

#算法

#两边去自然对数,lny=lna*e**(b*x)=lna+b*x

#y‘=lny,a‘=lna,

#原式转换为 y‘=b*x+a‘

#利用函数log_sampley,计算出y‘

#再利用y‘x‘算出ba‘

#再利用a‘算出a

#最后利用a,b, 得到y=a*e**(b*x)解析式

def main_mode3_regression(list_x,list_y,forecast_x,mode):

    #y列表取对数,生成新列表

    log_list_y=log_sample(list_y)

 

    #对两个新列表取平均数

    x_mean=mean(list_x)

    y_mean=mean(log_list_y)

 

    #对两个新列表算标准差

    s_x=s_deviation(list_x)

    s_y=s_deviation(log_list_y)

    s_xy_value=s_xy(list_x,log_list_y)

 

    #r_xy_value{x_i}{y_i}的相关系数

    r_xy_value=r_xy(s_xy_value,s_x,s_y)

    #如果r绝对值大,则可用线性方程表示

    r_estimate_value=r_estimate(r_xy_value)

 

    #线性方程的系数值

    b=linear_b(s_xy_value,s_x)

    #线性方程与y轴截距值

    exponent_a=linear_a(b,x_mean,y_mean)

    a=math.e**exponent_a

    forecast_value=forecast_linear(b,a,forecast_x,mode)

 

    #计算y的近似值

    list_linear_y=linear_y(b,a,list_x,mode)

    #计算残差值

    residual_list=residual(list_y,list_linear_y)

 

    wrongNumber_Predict=wrongNumber_check(list_x,list_y,residual_list)

 

    #标准输出

    print_out(x_mean,y_mean,s_x,s_y,s_xy_value,r_xy_value,r_estimate_value,\

              b,a,forecast_value,wrongNumber_Predict,mode)

 

    #绘制一元线性回归图

    draw_linear_regression_model(list_x,list_y,b,a,mode)

    #绘制残差图

    draw_residual(residual_list)

    

    

 

 

def main_mode5_regression(list_x,list_y,forecast_x,mode):

    #y列表取对数,生成新列表

    negative_reciprocal_x=negative_reciprocal(list_x)

    log_list_y=log_sample(list_y)

    #for test

    #print"negative_reciprocal_x:",negative_reciprocal_x

    #print"log_list_y",log_list_y

 

    #对两个新列表取平均数

    x_mean=mean(negative_reciprocal_x)

    y_mean=mean(log_list_y)

 

    #对两个新列表算标准差

    s_x=s_deviation(negative_reciprocal_x)

    s_y=s_deviation(log_list_y)

    s_xy_value=s_xy(negative_reciprocal_x,log_list_y)

 

    #r_xy_value{x_i}{y_i}的相关系数

    r_xy_value=r_xy(s_xy_value,s_x,s_y)

    #如果r绝对值大,则可用线性方程表示

    r_estimate_value=r_estimate(r_xy_value)

 

    #线性方程的系数值

    b=linear_b(s_xy_value,s_x)

    #线性方程与y轴截距值

    exponent_a=linear_a(b,x_mean,y_mean)

    a=math.e**exponent_a

    forecast_value=forecast_linear(b,a,forecast_x,mode)

 

    

    #计算y的近似值

    list_linear_y=linear_y(b,a,list_x,mode)

    #计算残差值

    residual_list=residual(list_y,list_linear_y)

 

    wrongNumber_Predict=wrongNumber_check(list_x,list_y,residual_list)

 

    #标准输出

    print_out(x_mean,y_mean,s_x,s_y,s_xy_value,r_xy_value,r_estimate_value,\

              b,a,forecast_value,wrongNumber_Predict,mode)

 

    #绘制一元线性回归图

    draw_linear_regression_model(list_x,list_y,b,a,mode)

    #绘制残差图

    draw_residual(residual_list)

 

 

 

def main_mode6_regression(list_x,list_y,forecast_x,mode):

 

    #x列表取平方数

    square_list_x=square(list_x)

    

    #x平均数

    x_mean=mean(square_list_x)

    #y平均数

    y_mean=mean(list_y)

    #list_x的标准差

    s_x=s_deviation(square_list_x)

    #list_y的标准差

    s_y=s_deviation(list_y)

    s_xy_value=s_xy(square_list_x,list_y)

    #r_xy_value{x_i}{y_i}的相关系数

    r_xy_value=r_xy(s_xy_value,s_x,s_y)

    #如果r绝对值大,则可用线性方程表示

    r_estimate_value=r_estimate(r_xy_value)

    #线性方程的系数值

    b=linear_b(s_xy_value,s_x)

    #线性方程与y轴截距值

    a=linear_a(b,x_mean,y_mean)

 

    forecast_value=forecast_linear(b,a,forecast_x,mode)

 

    #计算y的近似值

    list_linear_y=linear_y(b,a,list_x,mode)

    #计算残差值

    residual_list=residual(list_y,list_linear_y)

 

    wrongNumber_Predict=wrongNumber_check(list_x,list_y,residual_list)

 

    #标准输出

    print_out(x_mean,y_mean,s_x,s_y,s_xy_value,r_xy_value,r_estimate_value,\

              b,a,forecast_value,wrongNumber_Predict,mode)

 

    #绘制一元线性回归图

    draw_linear_regression_model(list_x,list_y,b,a,mode)

    #绘制残差图

    draw_residual(residual_list)

 

 

    

 

 

#测试数据

#船只数量和撞死的海牛数

#list_x=[447,460,481,498,513,512,526,559,585,614,645,675,711,719]

#list_y=[13,21,24,16,24,20,15,34,33,33,39,43,50,47]

 

#1.出口贸易和GDP

#list_x=[6.21,7.19,8.49,9.17,12.10,14.88,15.11,18.29,18.37,19.49,24.92]

#list_y=[185.48,216.18,266.38,346.34,467.59,584.78,678.85,744.63,783.45,820.68,894.42]

 

#2.人均资本和人均产出

#list_x=[3,4,5.5,6.5,7,8,9,10.5,11.5,14]

#list_y=[4.12,4.67,8.68,11.01,13.04,14.43,17.50,25.46,26.66,45.20]

    

#程序算出对数值

#list_x=[1.09861,1.38629,1.70475,1.87180,1.94591,2.07944,2.19722,2.35138,2.44235,2.63906]

#list_y=[1.41585,1.54116,2.16102,2.39880,2.56802,2.66931,2.86220,3.23711,3.28316,3.81110]

 

#3.样本测试数据

#list_x=[1,2,3]

#list_y=[4,5,6]

 

#4.身高和体重

list_x=[165,165,157,170,175,165,155,170]

list_y=[48,57,50,54,64,61,43,59]

 

#5.比萨斜塔倾斜值和年份

#年份全值参考,倾斜值取第二位小数开始

#list_x=[1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987]

 

#倾斜值取全部,年份用1-10代替

#list_y=[2.9642,2.9644,2.9656,2.9667,2.9673,2.9688,2.9696,2.9689,2.9713,2.9717,2.9725,2.9742,2.9757]

 

#年份和倾斜值取部分,检测结果有几厘米误差

#list_x=[1975,1977,1980,1982,1984,1986]

#list_y=[642,656,688,689,717,742]

 

#较优取值

#list_x=[1,2,3,4,5,6,7,8,9,10,11,12,13]

#list_y=[642,644,656,667,673,688,696,689,713,717,725,742,757]

 

#6.产卵数和温度

#list_x=[21,23,25,27,29,32,35]

#list_y=[7,11,21,24,66,115,325]

 

 

#7.工作年限与销售金额

#list_x=[3,2,10,5,8,4,4,8]

#list_y=[22,18,95,40,75,45,40,78]

 

#8.染料光学密度和银的光学密度

#list_x=[0.05,0.06,0.07,0.1,0.14,0.2,0.25,0.31,0.38,0.43]

#list_y=[0.1,0.14,0.23,0.37,0.59,0.79,1.0,1.12,1.19,1.25]

#list_x取负倒数的新列表

#[-20.0, -16.666666666666668, -14.285714285714285, -10.0,

#-7.142857142857142, -5.0, -4.0, -3.2258064516129035, -2.6315789473684212, -2.3255813953488373]

#list_y取对数的新列表

#[-2.3025850929940455, -1.9661128563728327, -1.4696759700589417, -0.9942522733438669, -0.527632742082372,

#-0.23572233352106983, 0.0, 0.11332868530700327, 0.17395330712343798, 0.22314355131420976]

  

 

#预测值

forecast_x=172

#绘图模式,mode=linear(线性标准)

#其它有

#mode=1 (y=a+b/x)

#mode=2 (y=a*x**b)

#mode=3 (y=a*e**(b*x))

#mode=4 (y=a*e**(b/x))

#mode=5 (y=a*e**(-b/x))

#mode=6 (y=b*x**2+a)

#mode=7 (y=a+b*lnx)

 

mode_list=["linear",2,3,6,5]

mode=mode_choose(list_x,list_y,mode_list)

 

#根据mode类别,自动执行主函数

if mode=="linear":

    print "execution in linear mode:"

    main_linear_regression(list_x,list_y,forecast_x,mode)

 

if mode==2:

    print "execution in mode 2:"

    main_mode2_regression(list_x,list_y,forecast_x,mode)

 

if mode==5:

    print "execution in mode 5:"

    main_mode5_regression(list_x,list_y,forecast_x,mode)

    

if mode==6:

    print "execution in mode 6:"

main_mode6_regression(list_x,list_y,forecast_x,mode)    

 

 

 

采用数据

身高和体重

list_x=[165,165,157,170,175,165,155,170]

list_y=[48,57,50,54,64,61,43,59]

 

智能判断mode--5

并检查可能错误数据 

 

 技术分享

 

 

技术分享

 

技术分享

 

线性回归自动分析

标签:

原文地址:http://www.cnblogs.com/biopy/p/4234727.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!