线性回归自动分析

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_x和list_y是绘制点的x和y值集合,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_sample和x,y,计算出y‘和x‘

#再利用y‘和x‘算出b和a‘

#再利用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_sample和y,计算出y‘

#再利用y‘和x‘算出b和a‘

#再利用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

并检查可能错误数据

时间: 2024-11-14 09:27:08

线性回归自动分析的相关文章

用scikit-learn和pandas学习线性回归

对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了. 1. 获取数据,定义问题 没有数据,当然没法研究机器学习啦.:) 这里我们用UCI大学公开的机器学习数据来跑线性回归. 数据的介绍在这: http://archive.ics.uci.edu/ml/datasets/Combined+Cycle+Power+Plant 数据的下载地址在这: http://archive.ics.uci.edu/ml/ma

线性回归

线性回归简介 线性回归是指利用线性回归方程中的最小平方函数对一个或多个自变量和因变量之间的关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数的线性组合. 案例简介 本案例中的数据是一组男孩年龄与身高的数据,我们将年龄作为自变量,身高作为因变量,二组数据分别从.dat文件中读取,最后拟合出一个线性关系式. 具体分析见http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=MachineLearni

Spark MLlib Linear Regression线性回归算法

1.Spark MLlib Linear Regression线性回归算法 1.1 线性回归算法 1.1.1 基础理论 在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数的线性组合. 回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析.如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间

正规方程(Normal Equation)——对于线性回归问题的一种快速解法

对于某些线性回归问题,正规方程方法可能更加简单高效. 正规方程推导过程如下: 梯度下降法和正规方程的比较: 总结: 只要特征数量并不是特别大,对于线性回归问题正规方程是一个比梯度下降算法更快的替代算法.但是当特征数量非常多的时候或者模型更复杂的时候(比如logistic regression等),正规方程就不再适用了.而梯度下降方法都可以使用.另外,当XTX是奇异矩阵(也称退化矩阵,不可逆)时,正规方程也不能使用,但是这种情况很少会发生(m≤n或者存在有依赖关系的特征).

线性回归的应用——容量预测

一个发展中的电信市场,网络容量往往是线性增加的,我们可以通过拟合历史网络容量指标,来判断未来网络规模,从而提前进行网络扩容,防患于未然. 线性回归实际上是找到一条直线,使得所有观测点y值到直线的离差平方和最小. 一.多元线性回归 多元线性回归使用矩阵方程可以很好的描述: 1. 拟合的p元线性方式格式 2. 回归拟合直线满足观测值与理论值离差平方和最小 3. 分别对p+1个因变量系数Beta求导,得到如下方程组 4. 进一步化简 5. 采用矩阵形式表示方程 6. 则方程系数如下 二.一元线性回归

一元线性回归

1.概念 一元线性回归是最简单的一种模型,但应用广泛,比如简单地预测商品价格.成本评估等,都可以用一元线性模型,本节主要讲解scikit-learn一元线性回归的使用以及作图说明. y=f(x)叫做一元函数,回归的意思就是根据已知数据复原某些值,线性回归(regression)就是用线性的模型做回归复原. 那么一元线性回归就是:已知一批(x,y)值来复原另外未知的值. 比如:告诉你(1,1),(2,2),(3,3),那么问你(4,?)是多少,很容易复原出来(4,4),这就是一元线性回归问题的求解

对线性回归,logistic回归和一般回归的认识

假设有一个房屋销售的数据如下:这个表类似于北京5环左右的房屋价钱,我们可以做出一个图,x轴是房屋的面积.y轴是房屋的售价,如下: 如果来了一个新的面积,假设在销售价钱的记录中没有的,我们怎么办呢? 我们可以用一条曲线去尽量准的拟合这些数据,然后如果有新的输入过来,我们可以在将曲线上这个点对应的值返回.如果用一条直线去拟合,可能是下面 的样子:绿色的点就是我们想要预测的点. 首先给出一些概念和常用的符号. 房屋销售记录表:训练集(training set)或者训练数据(training data)

简单线性回归

协方差:两个变量总体误差的期望. 简单的说就是度量Y和X之间关系的方向和强度. X :预测变量Y :响应变量 Y和X的协方差:[来度量各个维度偏离其均值的程度] 备注:[之所以除以n-1而不是除以n,是因为这样能使我们以较小的样本集更好的逼近总体的协方差,即统计上所谓的"无偏估计".而方差则仅仅是标准差的平方] 如果结果为正值,则说明两者是正相关的(从协方差可以引出"相关系数"的定义), 如果结果为负值就说明负相关的 如果为0,也是就是统计上说的"相互独立

bzoj4195[Noi2015]程序自动分析

bzoj4195[Noi2015]程序自动分析 题意: t组数据,每组n个给出两个变量是相等还是不等的约束条件,要求判断是否能满足.n≤1000000,变量数量≤109 题解: 先离散化,然后只处理相等条件用并查集维护“相等集合”,接着对每个不相等条件判断是否在一个集合,是的话则说明不满足. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue&g