手写LASSO回归python实现


import numpy as np
from matplotlib.font_manager import FontProperties
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

class Lasso():
    def __init__(self):
        pass

    # 数据准备
    def prepare_data(self):
        # 生成样本数据
        X, y = make_regression(n_samples=40, n_features=80, random_state=0, noise=0.5)
        # 划分数据集
        X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

        return X_train, X_test, y_train.reshape(-1,1), y_test.reshape(-1,1)


    # 参数初始化
    def initialize_params(self, dims):
        w = np.zeros((dims, 1))
        b = 0
        return w, b

    # 定义L1损失函数
    def l1_loss(self, X, y, w, b, alpha):
        num_train = X.shape[0]  # 样本数
        num_feature = X.shape[1]  # 特征数

        y_hat = np.dot(X, w) + b  # 回归预测数据
        # 计算损失
        loss = np.sum((y_hat - y) ** 2) / num_train + alpha * np.sum(np.abs(w))  
        # 计算梯度,即参数的变化
        dw = np.dot(X.T, (y_hat - y)) / num_train + alpha * np.sign(w)  
        db = np.sum((y_hat - y)) / num_train
        return y_hat, loss, dw, db

    def lasso_train(self, X, y, learning_rate, epochs, alpha):
        loss_list = []
        w, b = self.initialize_params(X.shape[1])

        # 归一化特征
        X = (X - np.mean(X, axis=0)) / np.std(X, axis=0)

        for i in range(1, epochs):
            y_hat, loss, dw, db = self.l1_loss(X, y, w, b, alpha)
            # 更新参数
            w += -learning_rate * dw
            b += -learning_rate * db
            loss_list.append(loss)


            # if i % 300 == 0:
            #     print('epoch %d loss %f' % (i, loss))

            params = {
                'w': w,
                'b': b
            }
            grads = {
                'dw': dw,
                'db': db
            }
        return loss, loss_list, params, grads

    # 根据计算的得到的参数进行预测
    def predict(self, X, params):
        w = params['w']
        b = params['b']
        y_pred = np.dot(X, w) + b
        return y_pred


if __name__ == '__main__':
    lasso = Lasso()
    X_train, X_test, y_train, y_test = lasso.prepare_data()

    alphas=np.arange(0.01,0.11,0.01)
    wc=[]#统计参数w中绝对值小于0.1的个数,模拟稀疏度
    for alpha in alphas:
        # 参数:训练集x,训练集y,学习率,迭代次数,正则化系数
        loss, loss_list, params, grads = lasso.lasso_train(X_train, y_train, 0.02, 3000,alpha)
        w=np.squeeze(params['w'])
        count=np.sum(np.abs(w)<1e-1)
        wc.append(count)

    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.figure(figsize=(10, 8))
    plt.plot(alphas, wc, 'o-')
    plt.xlabel('正则项系数',fontsize=15)
    plt.ylabel('参数w矩阵的稀疏度',fontsize=15)
    plt.show()

当然,我可以帮你提供一个Lasso回归Python代码示例。Lasso回归是一种用于特征选择和稀疏建模的线性回归方法。 首先,你需要安装scikit-learn库,它提供了很多机器学习算法的实现。你可以使用以下命令安装: ``` pip install scikit-learn ``` 下面是一个简单的例子,演示如何在Python中使用Lasso回归: ```python from sklearn.linear_model import Lasso from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error # 加载波士顿房价数据集 boston = load_boston() X, y = boston.data, boston.target # 将数据集分割为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建Lasso回归模型 lasso = Lasso(alpha=0.1) # 使用训练数据拟合模型 lasso.fit(X_train, y_train) # 使用测试数据进行预测 y_pred = lasso.predict(X_test) # 计算均方误差 mse = mean_squared_error(y_test, y_pred) print("均方误差: ", mse) ``` 在这个例子中,我们使用波士顿房价数据集,将数据集分割为训练集和测试集。然后,我们创建了一个Lasso回归模型,并使用训练数据进行拟合。最后,我们使用测试数据进行预测,并计算预测结果的均方误差。 你可以根据自己的需求调整Lasso回归的超参数,比如alpha值,来控制正则化强度和特征选择的程度。 希望这个例子能够帮到你!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值