概述
我是一名高一学生,马上高二了,最近做题出现的求回归方程题目,眼瞎的我翻了一面才发现数据已经给出了(rì)然而我已经花了将近20分钟在计算上,虽然只有10个数据,对于没计算器的我(计算能力又差的一批)已经是天文数字了,于是我决定等学会了编程,我一定要做一个程序直接算出回归方程,而且这个代码不调用任何库,这样更有成就感吧,下面我来解释一下这个代码
定义函数
先定义几个函数方便后面用
求和函数
首先是求和函数,把列表的所有数求和,输出和
def qh(x): # 列表求和函数
total = 0
list1 = x
for ele in range(0, len(list1)):
total = total + list1[ele]
return total
平均值函数
然后是求平均值函数,把列表的所有数求和再除int(步长)(个数),输出平均值
def pj(x): # 列表求平均值函数
total = 0
list1 = x
for ele in range(0, len(list1)):
total = total + list1[ele]
return total / int(len(list1))
方差函数
再次是求方差函数
def fc(nlist): # 列表求方差函数
n = len(nlist)
sum1 = 0.0
sum2 = 0.0
for i in range(n):
sum1 += nlist[i]
sum2 += nlist[i] ** 2
mean = sum1 / n
var = sum2 / n - mean ** 2
return var
平方和函数
然后是平方和函数,列表的各个数平方后相加,在上一个求方差函数也用到相同原理
def pfh(x): # 列表求平方和函数
total = 0
list1 = x
for ele in range(0, len(list1)):
total = total + list1[ele] ** 2
return total
列表对应乘积函数
最后是对应乘积函数,利用lambda匿名函数和map函数求对应乘积,注意的是返回的是一个新列表而不是求和后结果在之后要用前面的求和函数再求和
def cj(list1, list2): # 列表求对应乘积返回新列表
n = lambda x, y: x * y
result = map(n, list1, list2)
list_result = list(result)
return list_result
接收数值
利用函数split函数,将input接收的数值分割,达到一次输入的效果
# X的列表为横坐标
print('请输入X的值,用空格隔开')
X = input().split(' ')
X = list(map(float, X))
# Y的列表为纵坐标
print('请输入Y的值,用空格隔开')
Y = input().split(' ')
Y = list(map(float, Y))
最小二乘法
利用高中的最小二乘法求出回归方程的a-hat,b-hat
# n为数据个数
n = len(X)
xb = pj(X)
yb = pj(Y)
xi2 = pfh(X)
xy = qh(cj(X, Y))
high = xy - n * xb * yb
low = xi2 - n * xb ** 2
bm = high / low
am = yb - bm * xb
输出数据
将格式自定义做成y = a-hatx +b-hat
在用input函数让结果停留(以便广大高中生借鉴答案 /斜眼笑)
效果图
打包后效果大概就是这个样子,自己也可以改动
if am < 0:
print('回归方程为 : ', 'y', ' = ', round(bm, 4), 'x', round(am, 4))
else:
print('回归方程为 : ', 'y', ' = ', round(bm, 4), 'x', ' +', round(am, 4))
input("按Enter键退出")
源代码
此处附上源码
def qh(x): # 列表求和函数
total = 0
list1 = x
for ele in range(0, len(list1)):
total = total + list1[ele]
return total
def pj(x): # 列表求平均值函数
total = 0
list1 = x
for ele in range(0, len(list1)):
total = total + list1[ele]
return total / int(len(list1))
def fc(nlist): # 列表求方差函数
n = len(nlist)
sum1 = 0.0
sum2 = 0.0
for i in range(n):
sum1 += nlist[i]
sum2 += nlist[i] ** 2
mean = sum1 / n
var = sum2 / n - mean ** 2
return var
def pfh(x): # 列表求平方和函数
total = 0
list1 = x
for ele in range(0, len(list1)):
total = total + list1[ele] ** 2
return total
def cj(list1, list2): # 列表求对应乘积返回新列表
n = lambda x, y: x * y
result = map(n, list1, list2)
list_result = list(result)
return list_result
# X的列表为横坐标
print('请输入X的值,用空格隔开')
X = input().split(' ')
X = list(map(float, X))
# Y的列表为纵坐标
print('请输入Y的值,用空格隔开')
Y = input().split(' ')
Y = list(map(float, Y))
# n为数据个数
n = len(X)
xb = pj(X)
yb = pj(Y)
xi2 = pfh(X)
xy = qh(cj(X, Y))
high = xy - n * xb * yb
low = xi2 - n * xb ** 2
bm = high / low
am = yb - bm * xb
if am < 0:
print('回归方程为 : ', 'y', ' = ', round(bm, 4), 'x', round(am, 4))
else:
print('回归方程为 : ', 'y', ' = ', round(bm, 4), 'x', ' +', round(am, 4))
input("按Enter键退出")
写博客也不容易,希望大家看了后能点个赞谢谢
希望以上的代码能对你有所帮助,谢谢观阅!
原文链接:https://blog.csdn.net/CWH_BB/article/details/107701302
最后
以上就是重要帆布鞋为你收集整理的4、python简单线性回归代码案例(完整)_Python:简单线性回归(不需要调用任何库,math都不要)...的全部内容,希望文章能够帮你解决4、python简单线性回归代码案例(完整)_Python:简单线性回归(不需要调用任何库,math都不要)...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复