数据分析课设

这两天帮一个学弟做了个小课设,用多元线性回归预测销售额

牙疼原因,去买了药,然后在回来之后帮学弟写了下代码,昨天晚上想更新题解的,结果牙疼的难受,我就回宿舍睡觉了

今天也疼,牙疼带着扁桃体发炎,吃了人工牛黄甲硝唑胶囊,还有阿莫西林,希望早点好吧

保研推迟了两周(气到想骂人 ),各种不顺,各种烦躁

import sys
import os
import numpy as np
import pandas as pd


# 对数据集中的样本属性进行分割,制作X和Y矩阵
def feature_label_split(pd_data):
    # 行数、列数
    row_cnt = pd_data.shape[0] - 1
    column_cnt = 4
    # 生成新的X、Y矩阵
    X = np.empty([row_cnt, column_cnt - 1])  # 生成两个随机未初始化的矩阵
    Y = np.empty([row_cnt, 1])
    for i in range(1, row_cnt+1):
        row_array = pd_data.iloc[i,[1,2,3,4]]
        X[i-1] = np.array(row_array[0:3])
        Y[i-1] = np.array(row_array[4])
    return X, Y


# 把特征数据进行标准化为均匀分布
def uniform_norm(X_in):
    X_max = X_in.max(axis=0)
    X_min = X_in.min(axis=0)
    X = (X_in - X_min) / (X_max - X_min)
    return X, X_max, X_min


# 线性回归模型
class linear_regression():

    def fit(self, train_X_in, train_Y, learning_rate=0.03):
        # 样本个数、样本的属性个数
        case_cnt, feature_cnt = train_X_in.shape
        # X矩阵X0向量
        train_X = np.c_[train_X_in, np.ones(case_cnt, )]

        # 初始化待调参数theta
        self.theta = np.ones([feature_cnt+1, 1])

        max_iter_num = sys.maxsize  # 最多迭代次数
        step = 0  # 当前已经迭代的次数
        pre_step = 0  # 上一次得到较好学习误差的迭代学习次数

        last_error_J = sys.maxsize  # 上一次得到较好学习误差的误差函数值
        threshold_value = 1e-6  # 定义在得到较好学习误差之后截止学习的阈值
        stay_threshold_times = 10  # 定义在得到较好学习误差之后截止学习之前的学习次数

        for step in range(0, max_iter_num):
            #预测值
            pred = train_X.dot(self.theta)
            #损失函数
            J_theta = sum((pred-train_Y)**2) / (2*case_cnt)
            #更新参数theta
            self.theta -= learning_rate*(lamda*self.theta + (train_X.T.dot(pred-train_Y))/case_cnt)          

            #检测损失函数的变化值,提前结束迭代
            if J_theta < last_error_J - threshold_value:
                last_error_J = J_theta
                pre_step = step
            elif step - pre_step > stay_threshold_times:
                break

            #定期打印,方便用户观察变化 
            if step % 50 == 0:
                print("step %s: %.6f" % (step, J_theta))


    def predict(self, X_in):
        case_cnt = X_in.shape[0]
        X = np.c_[X_in, np.ones(case_cnt, )]
        pred = X.dot(self.theta)
        return pred


# 主函数
if __name__ == "__main__":
    # 读取训练集和测试集文件
    train_data = pd.read_excel("SJY.xls", header=None)

    # 对训练集和测试集进行X,Y分离
    train_X, train_Y = feature_label_split(train_data)

    # 对X(包括train_X, test_X)进行归一化处理,方便后续操作
    unif_trainX, X_max, X_min = uniform_norm(train_X)

    # 模型训练
    model = linear_regression()

    model.fit(unif_trainX, train_Y, learning_rate=0.003)


这是python代码,然后又用jupyter做了一下可视化,用statsmodels.api这个库又拟合了一下,方便他写报告

GitHub代码~可视化

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值