首页 > 分享 > 线性回归的推导与简单的一元线性回归代码实现

线性回归的推导与简单的一元线性回归代码实现

直入正题,一元线性回归就是一次函数,即y=kx+b

在线性函数中,x就是自变量,即模型需要输入的数据,y就是因变量,即我们需要预测的值

我们如何拟合一条符合数据变化趋势的曲线呢?这就要涉及误差值了,因为拟合出来的曲线能否代表数据特征,我们需要一个评判标准

曲线绝对无法完全拟合到每一个数据点上,但是我们能在这种拟合中寻找最优的那条曲线,评判依据就是误差值,什么是这里的误差值呢?

在这里我们将误差设为ee=y-kx-b

鉴于误差存在正负的波动所以我们以|e|来代表误差的大小,要求最小的误差,即求|e|的最小值

在整个训练数据集中就求:  sum_{n=i}^n left | e right | 的最小值,将公式进行推导,如下

令S为

为求S的极值,需要对k,b求偏导,并使其等于0,最后求出k,b的值用于代码的编写

frac{partial S}{partial k}=2times sum_{i=1}^n left ( y_i-kx_i-b right ) left ( -x_i right )

frac{partial S}{partial b}=2times sum_{i=1}^n left ( y_i-kx_i-b right ) left ( -1 right )

Rightarrow b = frac{sum_{i=1}^n (y_i-kx_i)}{n}=frac{sum_{i=1}^n y_i-k sum_{i=1}^{n} x_i}{n}

Rightarrow k = frac{n*sum_{i=1}^n x_iy_i-sum_{i=1}^n y_i*sum_{i=1}^n x_i}{n*sum_{i=1}^n x^2 - (sum_{i=1}^n x_i)^2}

以下是代码部分,采用python语言编写:

首先生成下测试数据

import numpy as np

import matplotlib.pyplot as plt

x = np.random.uniform(-10,10,size=100)

y = .4 * x + 3 + np.random.uniform(-1,1,size=100)

f = open('dataset/simulation_data_1d.txt','w')

for i in range(0,100):

line = str(x[i]) + ',' + str(y[i])

f.write(line)

f.write('n')

plt.plot(x,y,'b.')

plt.show()

然后根据算法推导结果编写算法部分

import matplotlib.pyplot as plt

import random

data = open('dataset/simulation_data_1d.txt', 'r').read()

x = []

y = []

for item in data.split('n'):

if item != '':

item = item.split(',')

x.append(float(item[0]))

y.append(float(item[1]))

def seperateData(x, y, test_scale):

data = []

for _x in x:

i = x.index(_x)

data.append([])

if type(_x) == 'list':

for feature in range(len(_x)):

data[i].append(feature)

data[i].append(y[i])

else:

data[i].append(_x)

data[i].append(y[i])

train = []

test = []

random.seed(3)

for i in range(len(data)):

count = random.random()

if count > test_scale:

train.append(data[i])

elif count < test_scale:

test.append(data[i])

return train, test

train, test = seperateData(x, y, 0.2)

X_train = []

Y_train = []

X_test = []

Y_test = []

for item in train:

X_train.append(item[:-1])

Y_train.append(item[-1])

for item in test:

X_test.append(item[:-1])

Y_test.append(item[-1])

Xsum = 0.0

Ysum = 0.0

XY = 0.0

X2sum = 0.0

n = len(Y_train)

for i in range(n):

Xsum += X_train[i][0]

Ysum += Y_train[i]

XY += X_train[i][0] * Y_train[i]

X2sum += X_train[i][0] ** 2

k = (n * XY - Xsum * Ysum) / (n * X2sum - Xsum ** 2)

b = (Ysum - k * Xsum) / n

print("拟合的曲线:y =",k,"* x +",b)

plt.plot(X_train, Y_train, 'b.')

plt.plot(X_test, Y_test, 'r*')

plt.xlabel("Trian_Area")

plt.ylabel("Trian_Price")

Y = []

for item in X_test:

Y.append(k * item[0] + b)

plt.plot(X_test, Y, 'g-')

plt.show()

总结:我jio的还口以,如有错误欢迎指正

相关知识

线性回归实例
task1 线性回归
【数据挖掘】一元线性回归在鸢尾花数据集中实战预测(超详细 附源码)
机器学习(一):线性回归算法的评测方式、R^2
基于Logistic回归模型对鸢尾花数据集的线性多分类
线性回归模型
python 线性回归
Python3机器学习实践:线性回归【实例:波士顿房价预测】
Iris鸢尾花数据集可视化、线性回归、决策树分析、KMeans聚类分析
python鸢尾花数据集的分类问题 -- 逻辑回归问题研究

网址: 线性回归的推导与简单的一元线性回归代码实现 https://m.huajiangbk.com/newsview1053576.html

所属分类:花卉
上一篇: 放热反应2NO(g)+O2(g)
下一篇: I 1 =3A, I 2 =2A