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
并检查可能错误数据