python实现线性回归之简单回归

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:

python实现线性回归之简单回归

代码来源:https://github.com/eriklindernoren/ML-From-Scratch

首先定义一个基本的回归类,作为各种回归方法的基类:

class Regression(object):

""" Base regression model. Models the relationship between a scalar dependent variable y and the independent 
variables X. 
Parameters:
-----------
n_iterations: float
    The number of training iterations the algorithm will tune the weights for.
learning_rate: float
    The step length that will be used when updating the weights.
"""
def __init__(self, n_iterations, learning_rate):
    self.n_iterations = n_iterations
    self.learning_rate = learning_rate

def initialize_wights(self, n_features):
    """ Initialize weights randomly [-1/N, 1/N] """
    limit = 1 / math.sqrt(n_features)
    self.w = np.random.uniform(-limit, limit, (n_features, ))

def fit(self, X, y):
    # Insert constant ones for bias weights
    X = np.insert(X, 0, 1, axis=1)
    self.training_errors = []
    self.initialize_weights(n_features=X.shape[1])

    # Do gradient descent for n_iterations
    for i in range(self.n_iterations):
        y_pred = X.dot(self.w)
        # Calculate l2 loss
        mse = np.mean(0.5 * (y - y_pred)**2 + self.regularization(self.w))
        self.training_errors.append(mse)
        # Gradient of l2 loss w.r.t w
        grad_w = -(y - y_pred).dot(X) + self.regularization.grad(self.w)
        # Update the weights
        self.w -= self.learning_rate * grad_w

def predict(self, X):
    # Insert constant ones for bias weights
    X = np.insert(X, 0, 1, axis=1)
    y_pred = X.dot(self.w)
    return y_pred

说明:初始化时传入两个参数,一个是迭代次数,另一个是学习率。initialize_weights()用于初始化权重。fit()用于训练。需要注意的是,对于原始的输入X,需要将其最前面添加一项为偏置项。predict()用于输出预测值。

接下来是简单线性回归,继承上面的基类:

class LinearRegression(Regression):

"""Linear model.
Parameters:
-----------
n_iterations: float
    The number of training iterations the algorithm will tune the weights for.
learning_rate: float
    The step length that will be used when updating the weights.
gradient_descent: boolean
    True or false depending if gradient descent should be used when training. If 
    false then we use batch optimization by least squares.
"""
def __init__(self, n_iterations=100, learning_rate=0.001, gradient_descent=True):
    self.gradient_descent = gradient_descent
    # No regularization
    self.regularization = lambda x: 0
    self.regularization.grad = lambda x: 0
    super(LinearRegression, self).__init__(n_iterations=n_iterations,
                                        learning_rate=learning_rate)
def fit(self, X, y):
    # If not gradient descent => Least squares approximation of w
    if not self.gradient_descent:
        # Insert constant ones for bias weights
        X = np.insert(X, 0, 1, axis=1)
        # Calculate weights by least squares (using Moore-Penrose pseudoinverse)
        U, S, V = np.linalg.svd(X.T.dot(X))
        S = np.diag(S)
        X_sq_reg_inv = V.dot(np.linalg.pinv(S)).dot(U.T)
        self.w = X_sq_reg_inv.dot(X.T).dot(y)
    else:
        super(LinearRegression, self).fit(X, y)

这里使用两种方式进行计算。如果规定gradient_descent=True,那么使用随机梯度下降算法进行训练,否则使用标准方程法进行训练。

最后是使用:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
import sys
sys.path.append("/content/drive/My Drive/learn/ML-From-Scratch/")

from mlfromscratch.utils import train_test_split, polynomial_features
from mlfromscratch.utils import mean_squared_error, Plot
from mlfromscratch.supervised_learning import LinearRegression

def main():

X, y = make_regression(n_samples=100, n_features=1, noise=20)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4)

n_samples, n_features = np.shape(X)

model = LinearRegression(n_iterations=100)

model.fit(X_train, y_train)

# Training error plot
n = len(model.training_errors)
training, = plt.plot(range(n), model.training_errors, label="Training Error")
plt.legend(handles=[training])
plt.title("Error Plot")
plt.ylabel('Mean Squared Error')
plt.xlabel('Iterations')
plt.savefig("test1.png")
plt.show()

y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print ("Mean squared error: %s" % (mse))

y_pred_line = model.predict(X)

# Color map
cmap = plt.get_cmap('viridis')

# Plot the results
m1 = plt.scatter(366 * X_train, y_train, color=cmap(0.9), s=10)
m2 = plt.scatter(366 * X_test, y_test, color=cmap(0.5), s=10)
plt.plot(366 * X, y_pred_line, color='black', linewidth=2, label="Prediction")
plt.suptitle("Linear Regression")
plt.title("MSE: %.2f" % mse, fontsize=10)
plt.xlabel('Day')
plt.ylabel('Temperature in Celcius')
plt.legend((m1, m2), ("Training data", "Test data"), loc='lower right')
plt.savefig("test2.png")
plt.show()

if name == "__main__":

main()

利用sklearn库生成线性回归数据,然后将其拆分为训练集和测试集。

utils下的mean_squared_error():

def mean_squared_error(y_true, y_pred):

""" Returns the mean squared error between y_true and y_pred """
mse = np.mean(np.power(y_true - y_pred, 2))
return mse

结果:

Mean squared error: 532.3321383700828

原文地址https://www.cnblogs.com/xiximayou/p/12802118.html

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
2月前
|
机器学习/深度学习 数据可视化 Python
使用最小二乘法进行线性回归(Python)
【10月更文挑战第28天】本文介绍了使用Python实现最小二乘法进行线性回归的步骤,包括数据准备、计算均值、计算斜率和截距、构建线性回归方程以及预测和可视化结果。通过示例代码展示了如何从创建数据点到最终绘制回归直线的完整过程。
|
2月前
|
机器学习/深度学习 算法 Python
使用Python实现简单的线性回归模型
【10月更文挑战第2天】使用Python实现简单的线性回归模型
19 1
|
2月前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python实现简单的线性回归模型
【10月更文挑战第2天】使用Python实现简单的线性回归模型
27 0
|
3月前
|
算法 Python
揭秘!Python数据魔术师如何玩转线性回归,让你的预测精准到不可思议
【9月更文挑战第13天】在数据科学领域,线性回归以其优雅而强大的特性,将复杂的数据关系转化为精准的预测模型。本文将揭秘Python数据魔术师如何利用这一统计方法,实现令人惊叹的预测精度。线性回归假设自变量与因变量间存在线性关系,通过拟合直线或超平面进行预测。Python的scikit-learn库提供了简便的LinearRegression类,使模型构建、训练和预测变得简单直接。
50 5
|
3月前
|
存储 算法 测试技术
预见未来?Python线性回归算法:数据中的秘密预言家
【9月更文挑战第11天】在数据的海洋中,线性回归算法犹如智慧的预言家,助我们揭示未知。本案例通过收集房屋面积、距市中心距离等数据,利用Python的pandas和scikit-learn库构建房价预测模型。经过训练与测试,模型展现出较好的预测能力,均方根误差(RMSE)低,帮助房地产投资者做出更明智决策。尽管现实关系复杂多变,线性回归仍提供了有效工具,引领我们在数据世界中自信前行。
52 5
|
4月前
|
机器学习/深度学习 数据采集 Python
利用Python实现简单的线性回归模型
【8月更文挑战第29天】本文将引导你了解并实践如何使用Python编程语言实现一个简单的线性回归模型。我们将通过一个实际的数据集,一步步地展示如何进行数据预处理、建立模型、训练及评估模型性能。文章旨在为初学者提供一个易于理解且实用的编程指南,帮助他们快速入门机器学习领域。
|
4月前
|
机器学习/深度学习 算法 Python
Python中实现简单的线性回归模型
【8月更文挑战第31天】本文将通过Python编程语言,介绍如何实现一个简单的线性回归模型。我们将从理论出发,逐步深入到代码实现,最后通过实例验证模型的有效性。无论你是初学者还是有一定编程基础的读者,都能从中获得启发和收获。让我们一起探索线性回归的世界吧!
|
4月前
|
存储 算法 定位技术
预见未来?Python线性回归算法:数据中的秘密预言家
【8月更文挑战第3天】站在数据的海洋边,线性回归算法犹如智慧的预言家,揭示着房价的秘密。作为房地产投资者,面对复杂的市场,我们可通过收集房屋面积、位置等数据并利用Python的pandas及scikit-learn库,建立线性回归模型预测房价。通过评估模型的均方根误差(RMSE),我们可以更精准地判断投资时机,让数据引领我们走向成功的彼岸。
25 1
|
4月前
|
机器学习/深度学习 人工智能 算法
探索机器学习:Python中的线性回归模型实现
【8月更文挑战第24天】在机器学习的世界中,线性回归是最基础也是应用最广泛的算法之一。本文将通过Python编程语言,使用scikit-learn库来实现一个简单的线性回归模型。我们将从理论出发,逐步深入到代码实现,最后通过一个实际数据集来验证模型的效果。无论你是机器学习的初学者,还是想要复习线性回归的基础知识,这篇文章都将为你提供有价值的信息。让我们一起踏上这段探索之旅吧!
|
4月前
|
存储 数据可视化 数据挖掘
【python】Python考研分数 线性回归模型预测(源码+论文)【独一无二】
【python】Python考研分数 线性回归模型预测(源码+论文)【独一无二】