import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScalerclass LinearRegression: def __init__(self): self.coeff_ = None self.interception_ = None self._theta = None def fit_gd(self, x_train, y_train,eta=0.01,n_iters=1e4): assert x_train.shape[0] == y_train.shape[0],'特征维度应当相等' def J(theta, X_b, y): try: return np.sum(y - X_b.dot(theta)) / len(y) except: return float('inf') def dJ(theta, X_b, y): return 2 * (X_b.dot(theta) - y).dot(X_b) / len(y) def gradient_descent(X_b, y, initial_theta, eta, n_iters=1e4, epsilon=1e-8): theta = initial_theta n_iter = 0 while n_iter < n_iters: gradient = dJ(theta, X_b, y) last_theta =theta theta = theta - eta * gradient if abs(J(last_theta, X_b,y) - J(theta, X_b, y)) < epsilon: break n_iter += 1 return theta 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) self.interception_ = self._theta[0] self.coeff_ = self._theta[1:] return self def fit_sgd(self,x_train,y_train,n_iters=5,t0=5,t1=50): def dJ_sgd(theta, X_b_i, y_i): pass def sgd(X_b, y, initial_theta, n_iters, t0 = 5,t1 = 50): pass def predict(self, x_predict): pass if __name__ == '__main__': # 使用梯度下降法进行训练 np.random.seed(666) # 设置随机种子 x = 2 * np.random.random(size=100) y = x * 3. + 4. + np.random.normal(size=100) X = x.reshape(-1, 1) reg2 = LinearRegression() reg2.fit_gd(X, y) print('梯度下降法训练结果') print(reg2.interception_) print(reg2.coeff_) # 使用梯度下降法进行训练给定模型 boston = datasets.load_boston() x = boston.data y = boston.target x = x[y < 50] y = y[y < 50] x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42) reg3 = LinearRegression() # 使用梯度下降法之前最好对数据进行归一化,不然很容易不收敛,得到[nan nan nan nan nan nan nan nan nan nan nan nan nan] standardScaler = StandardScaler() standardScaler.fit(x_train) x_train_standard = standardScaler.transform(x_train) reg3.fit_gd(x_train_standard, y_train) print('梯度下降法训练给定数据集结果') x_test_standard = standardScaler.transform(x_test) print(reg3.interception_) print(reg3.coeff_)
来源:https://www.cnblogs.com/orange-20/p/12658335.html