import numpy as np
from .metrics import r2_score
class LinearRegression:
def __init__(self):
"""初始化 Linear Regression 模型"""
self.coef_ = None
self.intercept_ = None
self._theta = None
def fit_normal(self, X_train, y_train):
"""根据训练数据集 X_train、y_train 训练 LinearRegression 模型"""
assert X_train.shape[0] == y_train.shape[0], \
'the size of X_train must be equal to the size of y_train'
X_b = np.hstack([np.ones((len(X_train), 1)), X_train])
self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train)
self.intercept_ = self._theta[0]
self.coef_ = self._theta[1:]
return self
def fit_gd(self, X_train, y_train, eta=0.01, n_iters=1e4):
"""根据训练数据集 X_train、y_train,使用梯度下降法训练 LinearRegression 模型"""
assert X_train.shape[0] == y_train.shape[0], \
'the size of X_train must bu equal the size of y_train'
def J(theta, X_b, y):
"""损失函数"""
try:
return np.sum((y - X_b.dot(theta)) ** 2) / len(y)
except:
return float('inf')
def dJ(theta, X_b, y):
"""用向量化计算损失函数的梯度(导数)"""
# res = np.empty(len(theta))
# res[0] = np.sum(X_b.dot(theta) - y)
# for i in range(1, len(theta)):
# res[i] = (X_b.dot(theta) - y).dot(X_b[:, i])
# return res * 2 / len(X_b)
return X_b.T.dot(X_b.dot(theta) - y) * 2 / len(y)
def gradient_descent(X_b, y, initial_theta, eta, n_iters=1e4, epsilon=1e-8):
"""求损失函数的斜率和截距"""
theta = initial_theta
cur_iter = 0
while cur_iter < n_iters:
gradient = dJ(theta, X_b, y)
last_theta = theta
theta = theta - eta * gradient
if abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon:
break
cur_iter += 1
return theta
# 构造第一行,形成 θ0X0(X0 ≡ 1 )
X_b = np.hstack([np.ones((len(X_train), 1)), X_train])
initial_theta = np.zeros(X_b.shape[1])
self._theta = gradient_descent(X_b, y_train, initial_theta, eta, n_iters)
self.intercept_ = self._theta[0]
self.coef_ = self._theta[1:]
return self
def fit_sgd(self, X_train, y_train, n_iters=5, t0=5, t1=50):
"""根据训练数据集 X_train、y_train,使用梯度下降法训练 LinearRegression 模型"""
assert X_train.shape[0] == y_train.shape[0], \
'the size of X_train must bu equal the size of y_train'
assert n_iters >= 1
def dJ_sdg(theta, X_b_i, y_i):
"""随机梯度下降法求随机选取的样本的梯度"""
return X_b_i * (X_b_i.dot(theta) - y_i) * 2.
def sgd(X_b, y, initial_theat, n_iters, t0=5, t1=50):
def learnin_rate(t):
"""学习率"""
return t0 / (t + t1)
theta = initial_theat
m = len(X_b)
for cur_iter in range(n_iters):
indexes = np.random.permutation(m)
X_b_new = X_b[indexes]
y_new = y[indexes]
for i in range(m):
gradient = dJ_sdg(theta, X_b_new[i], y_new[i])
theta = theta - learnin_rate(cur_iter * m + i) * gradient
return theta
X_b = np.hstack([np.ones((len(X_train), 1)), X_train])
initial_theta = np.random.rand(X_b.shape[1])
self._theta = sgd(X_b, y_train, initial_theta, n_iters, t0, t1)
self.intercept_ = self._theta[0]
self.coef_ = self._theta[1:]
return self
def predict(self, X_predict):
"""根据待预测数据集 X_predict,返回表示 X_predict 的结果向量"""
assert self.intercept_ is not None and self.coef_ is not None, \
'must fit before predict!'
assert X_predict.shape[1] == len(self.coef_), \
'the feature number of X_predict must be equal to X_train'
X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict])
return X_b.dot(self._theta)
def score(self, X_test, y_test):
"""根据测试数据集 X_test 和 y_test 确定当前模型的准确度"""
y_predict = self.predict(X_test)
return r2_score(y_test, y_predict)
def dJ_debug(theta, X_b, y, epsilon=0.01):
res = np.empty(len(theta))
for i in range(len(theta)):
theta_1 = theta.copy()
theta_1[i] += epsilon
theta_2 = theta.copy()
theta_2[i] -= epsilon
res[i] = (J(theta_1, X_b, y) - J(theta_2, X_b, y)) / (2 * epsilon)
return res
def __repr__(self):
return "LinearRegression()"
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
machine-learning机器学习入门课程代码 (276个子文件)
MachineLearning.iml 453B
实验15 - 使用 PCA 实践特征脸与人脸识别.ipynb 741KB
8-9 LASSO.ipynb 592KB
7-9 人脸识别与特征脸.ipynb 557KB
3-11 Matplotlib数据可视化基础.ipynb 358KB
3-11 Matplotlib数据可视化基础-checkpoint.ipynb 358KB
9-1 什么是逻辑回归.ipynb 318KB
Matplotlib基础.ipynb 277KB
实验4 - 使用 Matplotlib 绘制图形.ipynb 271KB
8-8 模型泛化与岭回归.ipynb 235KB
衡量回归算法的标准.ipynb 201KB
衡量回归算法的标准-checkpoint.ipynb 201KB
7-2 使用梯度上升法求解PCA问题.ipynb 175KB
Matplotlib基础-checkpoint.ipynb 165KB
实验23 - 逻辑回归中添加多项式特征.ipynb 163KB
6-4 实现线性回归中的梯度下降法.ipynb 148KB
7-2 使用梯度上升法求解PCA问题-checkpoint.ipynb 144KB
实验13 - Scikit-learn 中封装的主成分分析法.ipynb 128KB
实验14 - 使用 Scikit-learn 中 MNIST 手写数据集.ipynb 115KB
5-5 衡量线性回归法的指标 MSE,RMS,MAE.ipynb 114KB
7-8 使用PCA对数据进行降噪.ipynb 108KB
7-6 scikit-learn中的PCA.ipynb 106KB
7-6 scikit-learn中的PCA-checkpoint.ipynb 106KB
梯度下降法模拟.ipynb 106KB
9-7 scikit-learn中的逻辑回归.ipynb 105KB
实验17 - 过拟合和欠拟合.ipynb 102KB
8-3 过拟合与欠拟合.ipynb 102KB
实验20 - 岭回归.ipynb 102KB
6-2 模拟实现梯度下降法.ipynb 97KB
6-2 模拟实现梯度下降法-checkpoint.ipynb 97KB
9-4 实现逻辑回归算法.ipynb 96KB
9-4 实现逻辑回归算法-checkpoint.ipynb 96KB
实验29 - 直观理解高斯核函数.ipynb 95KB
11-3 scikit-learn 中的 SVM.ipynb 92KB
实验9 - 梯度下降法.ipynb 81KB
11-8 scikit-learn 中断 RBF 核.ipynb 78KB
实验25 - 实现混淆矩阵,精准率和召回率.ipynb 76KB
实验18 - 学习曲线.ipynb 75KB
12-5 CART与决策树中的超参数.ipynb 74KB
实验16 - 多项式回归.ipynb 73KB
实验32 - CART 和决策树的超参数.ipynb 72KB
8-4 为什么要训练数据集与测试数据集.ipynb 72KB
在线性回归模型中使用梯度下降法.ipynb 71KB
实验27 - scikit-learn 中的 SVM.ipynb 70KB
实现 Simple Liner Regression.ipynb 68KB
在线性回归模型中使用梯度下降法-checkpoint.ipynb 68KB
实验21 - LASSO 回归.ipynb 67KB
实验22 - 逻辑回归.ipynb 65KB
实验11 - 使用梯度上升法实现主成分分析算法.ipynb 64KB
9-6 在逻辑回归中使用多项式特征.ipynb 64KB
实验5 - Scikit-learn 中的数据集.ipynb 59KB
7-5 高维数据映射为低维数据.ipynb 58KB
7-5 高维数据映射为低维数据-checkpoint.ipynb 58KB
11-4 SVM 中使用多项式.ipynb 52KB
5-3 简单线性回归的实现.ipynb 51KB
读取数据和简单的数据探索.ipynb 50KB
实验8 - 使用 Scikit-learn 中的波士顿房产数据实践线性回归算法.ipynb 50KB
10-6 Precision-Recall (PR)曲线.ipynb 48KB
实验30 - 决策树.ipynb 44KB
3-12 数据加载和简单的数据探索.ipynb 43KB
9-8 OvR与OvO.ipynb 42KB
实验28 - SVM 中使用多项式特征.ipynb 41KB
实验2 - Numpy 操作矩阵和向量.ipynb 38KB
8-1 什么是多项式回归.ipynb 38KB
8-2 scikit-learn中的多项式回归于pipeline-checkpoint.ipynb 36KB
8-2 scikit-learn中的多项式回归于pipeline.ipynb 36KB
k-NN 基础.ipynb 35KB
k-NN 基础-checkpoint.ipynb 35KB
实验24 - OvR 和 OvO.ipynb 35KB
实验12 - 主成分分析法(PCA)求解多个主成分.ipynb 35KB
实验36 - 随机森林 和 Extra-Tree.ipynb 33KB
13-3 随机森林 和 Extra-Tree.ipynb 33KB
实验1 - Numpy 的用法.ipynb 32KB
3-5 Numpy数组的基本操作.ipynb 32KB
7-4 求数据的前n个主成分.ipynb 32KB
3-5 Numpy数组的基本操作-checkpoint.ipynb 32KB
网格搜索-checkpoint.ipynb 31KB
5-8 实现多元线性回归-checkpoint.ipynb 31KB
5-8 实现多元线性回归.ipynb 31KB
3-7 Numpy中的矩阵运算.ipynb 31KB
3-7 Numpy中的矩阵运算-checkpoint.ipynb 30KB
实验37 - OoB 和更多 Bagging 相关.ipynb 30KB
13-4 OoB 和更多 Bagging 相关.ipynb 30KB
实验35 - 集成学习.ipynb 29KB
13-1 集成学习.ipynb 29KB
实验36 - SoftVoting.ipynb 29KB
13-2 SoftVoting.ipynb 29KB
实验19 - 交叉验证.ipynb 29KB
实验38 - Ada Boosting 个 Gradient Boosting.ipynb 28KB
13-5 Ada Boosting 个 Gradient Boosting.ipynb 28KB
12-3 使用信息熵寻找最优划分.ipynb 28KB
分类精确度-checkpoint.ipynb 28KB
分类精确度.ipynb 28KB
数据归一化处理.ipynb 27KB
4-7 数据归一化.ipynb 27KB
实验10 - 随机梯度下降法.ipynb 27KB
14-1 数据加载.ipynb 27KB
Numpy.Array.ipynb 26KB
实验34 - 决策树的局限性.ipynb 25KB
12-7 - 决策树的局限性.ipynb 25KB
共 276 条
- 1
- 2
- 3
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6656
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Screenshot_20240430_144340_com.ss.android.ugc.live.jpg
- 回到山沟沟.mp3
- 111111111111111111
- 基于matlab实现关于语音信号声源定位DOA估计所用的一些传统算法.rar
- 基于ultralytics-yolov8, 将其检测/分类/分割/姿态等任务移植到rk3588上
- Screenshot_2024-04-30-21-47-24-26.jpg
- 基于matlab实现波束形成,包括线阵、平面阵和圆阵
- Python自动生成excel周期报告源码
- 基于matlab实现DOA 估计和自适应波束形成.rar
- 一个基于yolov8的火灾检测部署
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功