Python:简单线性回归(不需要调用任何库,math都不要)

我是一名高一学生,马上高二了,最近做题出现的求回归方程题目,眼瞎的我翻了一面才发现数据已经给出了(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键退出")

写博客也不容易,希望大家看了后能点个赞谢谢
希望以上的代码能对你有所帮助,谢谢观阅!
赞助商——吴俊豪

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值