<jupyter_start><jupyter_text>线性回归中使用梯度下降法(向量化)> 方法使用上一章我们封装好的梯度下降法，我们进一步进行了向量化提取和表示，如下图 ![J的导数dJ的向量化简化1](images/J的导数dJ的向量化简化1.png)> 下面是线性代数的向量化操作![J的导数dJ的向量化简化2](images/J的导数dJ的向量化简化2.png)> 最终的损失函数J的导数dJ的向量化表示，结果是一个n+1行1列的列向量，即theta向量的最佳取值，之所以转置是为了符合初始时假设的theta的形式，即维度是(n+1, 1)![最终的损失函数J的导数dJ的向量化表示](images/最终的损失函数J的导数dJ的向量化表示.png)> 下面是具体的代码实现<jupyter_code>import numpy as np
from sklearn import datasets
boston = datasets.load_boston()
X = boston.data
y = boston.target

X = X[y < 50.0]
y = y[y < 50.0]
print(X.shape)
print(y.shape)
from playML.model_selection import train_test_split
X_train, X_test, y_train, y_test  = train_test_split(X, y, seed=666)<jupyter_output><empty_output><jupyter_text>使用常规方法<jupyter_code>from playML.LinearRegression import LinearRegression
lin_reg1 = LinearRegression()
%time lin_reg1.fit_normal(X_train, y_train) # 上一章得到的线性回归算法的方法，对比下面的fit_gd
lin_reg1.score(X_test, y_test)<jupyter_output><empty_output><jupyter_text>使用梯度下降法(向量化)<jupyter_code>lin_reg2 = LinearRegression()
lin_reg2.fit_gd(X_train, y_train) # 因为数据集的偏差很大，所以会导致结果不收敛
lin_reg2.fit_gd(X_train, y_train, eta=0.000001) # eta太小，结果的准确率很低
lin_reg2.score(X_test, y_test) # 可能陷入了局部最优解，最好多循环一些
%time lin_reg2.fit_gd(X_train, y_train, eta=0.000001, n_iters=1e6)
lin_reg2.score(X_test, y_test)<jupyter_output><empty_output><jupyter_text>使用梯度下降法之前，最好要先进行数据归一化(强烈推荐)![使用梯度下降法之前最好要先进行数据归一化](images/使用梯度下降法之前最好要先进行数据归一化.png)<jupyter_code>from sklearn.preprocessing import StandardScaler # 因为上面不同特征的量纲不一样，导致数据的方差太大，进而影响收敛过程
standardScaler = StandardScaler()
standardScaler.fit(X_train)
X_train_standard = standardScaler.transform(X_train)
lin_reg3 = LinearRegression()
%time lin_reg3 = lin_reg3.fit_gd(X_train_standard, y_train) # 归一化后解决了算法的方差大的问题，不用再循环多次了(n_iters)
X_test_standard = standardScaler.transform(X_test)
lin_reg3.score(X_test_standard, y_test)<jupyter_output><empty_output><jupyter_text>梯度下降法的优势 > 数据量越大，梯度下降法(`fit_gd`)相对于线性回归法(`fit_normal高等数学方法求出的方程解`)的耗时优势越大<jupyter_code>import numpy as np 
from playML.LinearRegression import LinearRegression
m = 1000
n = 5000

big_X = np.random.normal(size=(m, n)) # m行代表样本数, n列代表特征数，每一行代表一个多元线性回归方程
true_theta = np.random.uniform(0.0, 100.0, size=n+1) # 生成n+1个0~100的theta，即多元线性方程的系数
big_y = big_X.dot(true_theta[1:]) + true_theta[0] + np.random.normal(0., 10.0, size=m) # 利用矩阵运算法计算出预测值y_hat
# 先使用使用数据推导的正规方程解法进行训练
big_reg1 = LinearRegression()
%time big_reg1.fit_normal(big_X, big_y)
# 使用梯度下降法进行数据训练
big_reg2 = LinearRegression()
%time big_reg2.fit_gd(big_X, big_y)<jupyter_output>Wall time: 2.15 s
{'fraction_non_alphanumeric': 0.1158560695927244, 'fraction_numerical': 0.031237643337287464, 'mean_word_length': 10.552511415525114, 'pattern_counts': {'":': 0, '<': 22, '<?xml version=': 0, '>': 25, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '627583', 'license': 'MulanPSL-1.0', 'n_tokens_mistral': 1477, 'n_tokens_neox': 1522, 'n_words': 132, 'path': 'Part5Improve/06-Gradient-Descent/05-Vectorize-Gradient-Descent/05-Vectorize-Gradient-Descent.ipynb', 'repo_name': '19920625lsg/itcast-python', 'size': '2529'}