2022.11.23 LinearRegression 学习笔记

​ 线性回归就是对一系列的数据进行拟合曲线然后用于预测新的数据的过程。线性回归是机器学习中入门的方法,是基础也很重要。数学推导主要是用最小二乘法作为代价函数,当代价函数最小时的参数w就是拟合曲线的最优参数,w可以推导出公式直接计算。但是这个公式得出参数的过程有一定的弊端,所以要用到后面的岭回归和LASSO回归,进行正则化处理

请添加图片描述

  • 参考代码如下
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
import sklearn.datasets

#生成100个一元回归数据集
# https://blog.csdn.net/Leytton/article/details/104088143?ops_request_misc=&request_id=&biz_id=102&utm_term=sklearn.datasets.make_regressi&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-104088143.142^v66^control,201^v3^control_1,213^v2^t3_control2&spm=1018.2226.3001.4187
# n_features:特征数(自变量个数)
# noise:噪音
# random_state:随机状态若为固定值则每次产生的数据都一样
x,y = sklearn.datasets.make_regression(n_features=1,noise=5,random_state=2020)
# 输入x坐标和y坐标

# plt.scatter(x,y)
# plt.show()


#加5个异常数据,为什么这么加,大家自己看一下生成的x,y的样子
# linspace 通过定义均匀间隔创建数值序列。其实,需要指定间隔起始点、终止端,以及指定分隔值总数(包括起始点和终止点);
# 最终函数返回间隔类均匀分布的数值序列。
# reshape 函数将一维数组转化为多维数组,参数为-1表示通过列数和总数自动计算出行数
a = np.linspace(1,2,5).reshape(-1,1)
b = np.array([350,380,410,430,480])

#生成新的数据集
# r_按行叠加两个矩阵
x_1 = np.r_[x,a]
y_1 = np.r_[y,b]

# plt.scatter(x_1,y_1)
# plt.show()

# 线性回归类
class normal():
    def __init__(self):
        pass

    def fit(self, x, y):
        m = x.shape[0]
        # numpy.concatenate()函数一次完成多个数组的拼接,axis=1按列拼接 =0 按行拼接
        X = np.concatenate((np.ones((m, 1)), x), axis=1)
        # 从列表/字符串中生成矩阵
        xMat = np.mat(X)
        yMat = np.mat(y.reshape(-1, 1))

        xTx = xMat.T * xMat
        # xTx.I为xTx的逆矩阵
        ws = xTx.I * xMat.T * yMat

        # 返回参数
        return ws

# 设置字体
# 字符显示
# 解决python没有黑体的问题,亲测有效
# https://blog.csdn.net/ben_na_/article/details/124238611?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166920724516800180650352%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166920724516800180650352&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-124238611-null-null.142^v66^control,201^v3^control_1,213^v2^t3_control2&utm_term=Mac%20findfont%3A%20Generic%20family%20sans-serif%20not%20found%20because%20none%20of%20the%20following%20families%20were%20found%3A%20SimHei&spm=1018.2226.3001.4187
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
print(matplotlib.get_cachedir())
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
clf1 = normal()
# 拟合原始数据
w1 = clf1.fit(x, y)
# 预测数据
y_pred = x * w1[1] + w1[0]

# 拟合新数据
w2 = clf1.fit(x_1, y_1)
# 预测数据
y_1_pred = x_1 * w2[1] + w2[0]

print('原始样本拟合参数:\n', w1)
print('\n')
print('新样本拟合参数:\n', w2)


ax1 = plt.subplot(111)
ax1.scatter(x_1, y_1, label='样本分布')
ax1.plot(x, y_pred, c='y', label='原始样本拟合')
ax1.plot(x_1, y_1_pred, c='r', label='新样本拟合')
ax1.legend(prop={'size': 15})  # 此参数改变标签字号的大小
plt.show()

参考博客

你可能感兴趣的:(机器学习,学习,python)