Python:使用cvxpy求解线性回归问题

优化分体为残差平方和最小,这是一个凸优化问题,使用cvxpy,过程过于简单。

    ##------数据生成部分----------##
    seed = 101
    X = np.random.uniform(low=1.0,high=10.0,size=300)
    y = X * 20 + 10 + np.random.normal(loc=0.0,scale=10.0,size=300)
    ##--------凸优化部分-------------##
    w = cvx.Variable()
    b = cvx.Variable()
    objective = cvx.Minimize(cvx.sum_squares((w * X + b) - y))
    constrant = []
    prob = cvx.Problem(objective,[])
    prob.solve()
    ##------结果可视化部分----------##
    print(w.value)
    print(b.value)
    show_data(X,y,w.value,b.value)
    plt.show()
    print("Loss=",np.mean(((w.value * X + b.value) - y)**2))

 

依赖cvxpy你就废了!你啥都学不到!

配上梯度下降方法计算出的对比。

'''
一元线性回归
代码可以正确运行,运行结果良好
'''
import numpy as np
import pandas as pd
import cvxpy as cvx
import matplotlib.pyplot as plt
import os

class LinearRegression(object):
    def __init__(self,learning_rate=0.01,max_iter=100,seed=101):
        self.w = np.random.randn(1)[0]
        self.b = np.random.randn(1)[0]
        self.lr = learning_rate
        self.max_iter = max_iter
        self.loss_arr = []

    def fit(self,X,y):
        self.X = X
        self.y = y
        for i in range(self.max_iter):
            self.Grandient_descent()
            self.loss_arr.append(self.loss())
    def model(self,X):
        return self.w * X + self.b

    def loss(self,y_true=None,y_pred=None):
        if y_true is None or y_pred is None:
            y_true = self.y
            y_pred = self.model(self.X)
        return np.sum((y_true - y_pred) ** 2)

    def cal_gradient(self):
        d_w = np.sum(2 * (self.model(self.X) - self.y) * self.X)/len(self.X) #不理解为什么要取平均
        d_b = np.sum(2 * (self.model(self.X) - self.y))/len(self.X)   #不理解为什么要取平均
        return d_w, d_b

    def Grandient_descent(self):
        d_w,d_b = self.cal_gradient()
        self.w -= self.lr * d_w
        self.b -= self.lr * d_b

def show_data(X,y,w=None,b=None):
    plt.scatter(X,y,marker='.')
    if w is not None and b is not None:
        plt.plot(X, X*w + b, c='r')


if __name__ == '__main__':
    seed = 101
    X = np.random.uniform(low=1.0,high=10.0,size=300)
    y = X * 20 + 10 + np.random.normal(loc=0.0,scale=10.0,size=300)
    regr = LinearRegression(learning_rate=0.01, max_iter=100, seed=101)
    regr.fit(X,y)

    # plt.plot(np.arange(len(regr.loss_arr)),regr.loss_arr,marker='o',c='green')
    w = cvx.Variable()
    b = cvx.Variable()
    objective = cvx.Minimize(cvx.sum_squares((w * X + b) - y))
    constrant = []
    prob = cvx.Problem(objective, [])
    prob.solve()
    show_data(X, y, w.value, b.value)
    show_data(X, y, regr.w, regr.b)
    plt.show()
    print("Loss=", np.mean(((w.value * X + b.value) - y) ** 2))
    print(regr.loss_arr[-1]/len(X))

 

手动调整梯度下降迭代次数

max_iter=100

迭代次数越大,梯度下降的计算结果越贴近cvxpy的优化结果。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
使用sklearn求解线性回归问题时,可以通过使用sklearn中的LinearRegression模型来实现。LinearRegression是sklearn中用于实现线性回归的类。它基于最小二乘法估计线性回归模型的参数。要使用LinearRegression模型,首先需要导入相应的库和数据集,然后创建一个LinearRegression对象,将数据集拟合到该模型中,并使用模型进行预测。 下面是使用sklearn求解线性回归问题的一般步骤: 1. 导入所需的库和数据集:首先,导入sklearn库中的LinearRegression模型,以及其他可能需要使用的库和数据集。 2. 准备数据集:将数据集划分为特征矩阵X和目标变量y。 3. 创建LinearRegression对象:使用LinearRegression()函数创建一个LinearRegression对象。 4. 拟合数据集:使用LinearRegression对象的fit()方法将特征矩阵X和目标变量y拟合到模型中,从而得到线性回归模型。 5. 预测:使用LinearRegression对象的predict()方法对新的特征矩阵进行预测,得到预测结果。 下面是一个示例代码: ```python # 导入所需的库和数据集 import numpy as np from sklearn.linear_model import LinearRegression # 准备数据集 X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]]) y = np.dot(X, np.array([1, 2])) + 3 # 创建LinearRegression对象 model = LinearRegression() # 拟合数据集 model.fit(X, y) # 预测 new_X = np.array([[3, 5], [4, 6]]) predictions = model.predict(new_X) # 打印预测结果 print(predictions) ``` 在上述示例代码中,我们首先导入了numpy和sklearn的LinearRegression模型。然后,我们准备了一个包含两个特征的数据集X和相应的目标变量y。接下来,我们创建了一个LinearRegression对象,并使用fit()方法将数据集拟合到模型中。最后,我们使用predict()方法对新的特征矩阵进行预测,并打印了预测结果。 请注意,上述示例代码中的数据集X和目标变量y只是为了演示目的而创建的简单示例。在实际应用中,您需要根据具体情况准备和处理您的数据集。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeniuHe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值