大数跨境
0
0

python之线性回归

python之线性回归 谁说菜鸟不会数据分析
2023-08-07
0
导读:内含代码
 
点击上方“机械电子工程技术”关注我们





线性回归是一种用于建立和训练模型的简单但常用的机器学习算法,用于预测一个或多个连续数值的目标变量。它建立了一个线性关系,将输入特征与输出目标之间进行映射。在线性回归中,目标变量被假设为输入特征的线性组合加上一个可选的误差项。
模型假设:

在线性回归中,我们做出以下假设:

输入特征与目标变量之间存在线性关系。
目标变量的噪声项服从零均值的高斯分布,即误差服从正态分布。
对于线性回归,模型表示为:
y = b + w1*x1 + w2*x2 + ... + wn*xn + e

其中,

y 是目标变量(待预测的连续数值),
x1, x2, ..., xn 是输入特征(自变量),
w1, w2, ..., wn 是权重参数,
b 是截距项,
e 是误差项。
目标函数:

线性回归的目标是找到最优的参数权重和截距项,使得预测值与真实值之间的残差(误差)尽可能小。通常采用最小二乘法来定义目标函数,即最小化残差的平方和(平方损失函数):

Loss = Σ(y_pred - y_actual)^2 / n


其中,

y_pred 是模型的预测值,
y_actual 是对应的真实目标值,
n 是样本数量。

参数估计:

在线性回归中,可以使用不同的方法来估计参数权重和截距项。常用的方法包括普通最小二乘法(Ordinary Least Squares, OLS),梯度下降法等。

训练过程:

在线性回归中,训练过程旨在通过样本数据拟合模型,并找到最优的参数权重和截距项。这可以通过最小化损失函数来实现,方法包括解析解和数值优化算法。

预测:

当模型训练完毕后,可以使用训练得到的参数来进行预测。给定新的输入特征,通过将其代入线性回归模型中,即可获得预测的目标变量值。

优点和限制:

线性回归具有以下优点:

实现简单、计算效率高。
在很多实际问题中表现良好。
提供可解释性,可以理解各个特征的权重对预测结果的影响。

然而,线性回归也有一些限制:

只能拟合线性关系,无法捕获非线性模式。
对异常值比较敏感。
假设误差项满足正态分布和独立性。如果不满足这些假设,模型可能无法准确地拟合数据。

总结:

线性回归是一种简单但实用的机器学习算法,可用于预测连续数值的目标变量。它建立了输入特征与目标之间的线性关系,并通过最小化残差的平方和来估计最优参数权重和截距项。线性回归具有广泛应用,可以在许多领域中进行数据分析、预测和决策支持。
基于numpy的的线性回归:
import numpy as npdef compute_error_for_line_given_points(b,w,points):    totalError=0    for i in range(0,len(points)):        x=points[i,0]        y=points[i,1]        totalError+=(y-(w*x+b))**2    return totalError/float(len(points))def step_gradient(b_current,w_current,points,learningRate):    b_gradient=0    w_gradient=0    N=float(len(points))    for i in range(0,len(points)):        x = points[i, 0]        y = points[i, 1]        b_gradient+=(2/N)*((w_current*x+b_current)-y)        w_gradient+=(2/N)*x*((w_current * x + b_current) - y)    new_b=b_current-(learningRate*b_gradient)    new_w=w_current-(learningRate*w_gradient)    return [new_b,new_w]def gradient_descent_runner(points,starting_b,starting_w,learning_rate,num_iterations):    b=starting_b    w=starting_w    for i in range(num_iterations):        b,w=step_gradient(b,w,points,learning_rate)    return [b,w]def run():    # points=np.genfromtxt(r"D:\pycharm pjt\1.csv",delimiter=",")    points=[[0,0],[1,1],[2,2],[3,3]]    learning_rate=0.0001    initial_b=0    initial_w=0    num_iterations=1000    print("Starting gradient descent at b={0},w={1},errer={2}"          .format(initial_b,initial_w,compute_error_for_line_given_points(initial_b,initial_w,np.array(points))))    print("Running")    [b,w]=gradient_descent_runner(np.array(points),initial_b,initial_w,learning_rate,num_iterations)    print("After {0} iterations b={1},w={2},errer={3}"          .format(num_iterations,b, w, compute_error_for_line_given_points(b, w, np.array(points))))if __name__=="__main__":    run()

Starting gradient descent at b=0,w=0,errer=3.5

Running

After 1000 iterations b=0.19624549351438988,w=0.47674666586859404,errer=0.688733148234418


基于Tensorflow的线性回归:

import tensorflow as tfimport numpy as np
# 定义输入特征和目标变量x_train = np.array([1, 2, 3, 4, 5], dtype=np.float32)y_train = np.array([2, 4, 6, 8, 10], dtype=np.float32)
# 初始化权重和偏置项w = tf.Variable(0.0)b = tf.Variable(0.0)
# 定义线性回归模型def linear_regression(x): return w * x + b
# 定义损失函数def loss_fn(y_true, y_pred): return tf.reduce_mean(tf.square(y_true - y_pred))
# 设置优化器optimizer = tf.optimizers.SGD(learning_rate=0.01)
# 定义训练函数def train_step(features, labels): with tf.GradientTape() as tape: predictions = linear_regression(features) loss_value = loss_fn(labels, predictions) gradients = tape.gradient(loss_value, [w, b]) optimizer.apply_gradients(zip(gradients, [w, b]))
# 模型训练for epoch in range(1000): train_step(x_train, y_train)
# 打印训练结果print("Weight:", w.numpy())print("Bias:", b.numpy())
# 进行预测x_test = np.array([6, 7, 8], dtype=np.float32)y_pred = linear_regression(x_test)print("Predictions:", y_pred.numpy())


       

想了解更多

赶紧扫码关注

【声明】内容源于网络
0
0
谁说菜鸟不会数据分析
以大数据分析为驱动,spss/R/python/数据分析交流技术分享,实用教程干货,敬请期待,B站UP主:谁说菜鸟不会数据分析 有更多在线实操视频。
内容 498
粉丝 0
谁说菜鸟不会数据分析 以大数据分析为驱动,spss/R/python/数据分析交流技术分享,实用教程干货,敬请期待,B站UP主:谁说菜鸟不会数据分析 有更多在线实操视频。
总阅读2
粉丝0
内容498