当前位置:   article > 正文

机器学习之线性回归_机器学习回归归一化代码

机器学习回归归一化代码

一、使用python来实现,使用解析解求解多元线性回归

  1. """
  2. 创建 100行1列的 x,y数据
  3. """
  4. # 解析解 求解模型的方法
  5. # numpy是做数值计算的
  6. import numpy as np
  7. # matplotlib 是关于绘图的
  8. import matplotlib.pyplot as plt
  9. # 回归,有监督的机器学习 X,y
  10. X= np.random.rand(100,1)
  11. # 这里要模拟出来的数据y是代表真实的数据,所以也就是y_hat+error 预期值和误差
  12. # 假设误差 服从正太分布
  13. # standard normal distribution 标准正太分布 期望为μ=0 方差1
  14. y= 2 +4*X +np.random.randn(100,1)
  15. # 为了去求解w0截距项,我们给X矩阵一开始加上一列全为1的X0
  16. # np.c_[] 拼接函数
  17. X_b = np.c_[np.ones((100,1)),X]
  18. # 实现解析解的公式来求解θ
  19. θ = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
  20. print(θ)
  21. # 使用模型去做预测
  22. # 新建数据
  23. X_new = np.array([[0],
  24. [2]])
  25. X_new_b = np.c_[np.ones((2,1)),X_new]
  26. print(X_new_b)
  27. y_predict = X_new_b.dot(θ)
  28. print(y_predict)
  29. # 绘图进行展示真实的数据点和我们预测用的模型
  30. plt.plot(X_new,y_predict,'r-')
  31. plt.plot(X,y,'b.')
  32. plt.axis([0,2,0,10])
  33. plt.show()

 二、使用Scikit-learn封装的线性回归函数求解多元线性回归

  1. import numpy as np
  2. from sklearn.linear_model import LinearRegression
  3. import matplotlib.pyplot as plt
  4. X1 = 2*np.random.rand(100, 1)
  5. X2 = 2*np.random.rand(100, 1)
  6. X = np.c_[X1, X2]
  7. y = 4 + 3*X1 + 5*X2 + np.random.randn(100, 1)
  8. reg = LinearRegression(fit_intercept=True) # fit_intercept 是否计算截距
  9. reg.fit(X, y) # 对X,y进行训练拟合
  10. print(reg.intercept_, reg.coef_) # intercept_ :截距项值 coef_:其他的参数值
  11. X_new = np.array([[0, 0],
  12. [2, 1],
  13. [2, 4]])
  14. y_predict = reg.predict(X_new)
  15. # 绘图进行展示真实的数据点和我们预测用的模型
  16. plt.plot(X_new[:, 0], y_predict, 'r-')
  17. plt.plot(X1, y, 'b.')
  18. plt.axis([0, 2, 0, 25])
  19. plt.show()

三、python 实现梯度下降法(全量梯度、随机梯度、小批量梯度)

1、全量梯度

  1. import numpy as np
  2. # 创建数据集X,y
  3. np.random.seed(1) # 设置随机种子,确定随机值
  4. X = np.random.rand(100,1)
  5. y = 4 + 3*X +np.random.randn(100,1) # 表示真实值
  6. X_b = np.c_[np.ones((100,1)),X]
  7. # 创建超参数
  8. learning_rate =0.001 # 学习率
  9. n_iteration = 10000
  10. # 第一步、初始化θ, θ=W0.....Wn, 标准正太分布创建W
  11. theta= np.random.randn(2,1)
  12. # 4、判断是否收敛,一般不会设定阈值,而是直接采用设置相对大的迭代次数保证可以收敛
  13. for _ in range(n_iteration):
  14. # 2、求梯度 ,计算gradient = (Xθ-y)Xj
  15. gradient = X_b.T.dot(X_b.dot(theta)-y)
  16. # 3、应用梯度下降法的公式去调整θ值 公式: θt+1 =θt-η*gradient
  17. theta = theta -learning_rate*gradient
  18. print(theta)

2、小批量梯度下降

  1. """
  2. 小批量梯度下降
  3. """
  4. import numpy as np
  5. # 创建数据集X,y
  6. X = np.random.rand(100,1)
  7. y = 4+ 3*X + np.random.randn(100,1)
  8. X_b = np.c_[np.ones((100,1)),X]
  9. # 创建超参数
  10. learn_rating = 0.0001
  11. n_epochs = 10000 # 迭代轮次
  12. m = 100 # 样本数
  13. batch_size = 10 # 每一批次使用多少条样本
  14. num_batches = int(m/batch_size) # 每一轮次 需要多少批次才能执行完一个完整样本
  15. # 第一步 随机初始化θ
  16. theta = np.random.randn(2,1)
  17. for epoch in range(n_epochs):
  18. # 在双层for循环之间,每个轮次开始分批次迭代之前 打乱数据索引顺序, 目的 保证随机性
  19. arr = np.arange(len(X_b)) # 返回索引列表
  20. np.random.shuffle(arr) # 把索引打乱顺序
  21. X_b = X_b[arr]
  22. y = y[arr]
  23. for i in range(num_batches):
  24. # random_index = np.random.randint(m)
  25. x_batch = X_b[i*batch_size:i*batch_size+batch_size]
  26. y_batch = y[i*batch_size:i*batch_size+batch_size]
  27. # 第二步 求梯度 gradient = (Xθ-y)Xj
  28. gradient = x_batch.T.dot(x_batch.dot(theta)-y_batch)
  29. # 第三步 用梯度下降法公式去调整θ值 公式: θt+1 =θt-η*gradient
  30. theta = theta - learn_rating*gradient
  31. print(theta)

3、随机梯度

  1. """
  2. 随机梯度: 随机一个样本进行测试
  3. """
  4. import numpy as np
  5. # 创建数据集X,y
  6. X = np.random.rand(100,1)
  7. y= 4 + 3*X + np.random.randn(100,1)
  8. X_b = np.c_[np.ones((100,1)),X]
  9. # 创建超参数
  10. learning_rating = 0.001 # 学习率
  11. n_epochs = 10000 # 迭代轮次
  12. m =100 # 100个样本
  13. # 第一步 初始化θ
  14. theta = np.random.randn(2,1)
  15. for epoch in range(n_epochs):
  16. arr = np.arange(len(X_b))
  17. np.random.shuffle(arr)
  18. X_b = X_b[arr]
  19. y = y[arr]
  20. for i in range(m):
  21. # random_index = np.random.randint(m)
  22. xi = X_b[i:i+1]
  23. yi = y[i:i+1]
  24. # 第二部 求梯度 gradient =(Xθ-y)Xj
  25. gradient = xi.T.dot(xi.dot(theta)-yi)
  26. # 3、应用梯度下降法的公式去调整θ值 公式: θt+1 =θt-η*gradient
  27. theta = theta - learning_rating*gradient
  28. print(theta)

四、归一化(最大最小值归一化、标准归一化)

1、最大最小值归一化

  1. import numpy as np
  2. from sklearn.preprocessing import MinMaxScaler
  3. scaler=MinMaxScaler() # 创建对象
  4. temp = np.array([1,2,3,4,5,5])
  5. # 求归一化
  6. result = scaler.fit_transform(temp.reshape(-1,1))
  7. print(result)

2、标准归一化

  1. """
  2. 代码实现标准归一化
  3. """
  4. from sklearn.preprocessing import StandardScaler
  5. import numpy as np
  6. temp = np.array([1,2,3,5,5])
  7. # 创建对象
  8. scaler = StandardScaler()
  9. # fit()会将某一列的均值和方差求出来
  10. scaler.fit(temp.reshape(-1,1))
  11. # 查看均值
  12. scaler.mean_
  13. # 查看标准差
  14. scaler.var_
  15. # 转换数据
  16. scaler.transform(temp.reshape(-1,1))

五、Lasso回归

  1. """
  2. lasso 回归 损失函数 +L2正则项
  3. """
  4. import numpy as np
  5. from sklearn.linear_model import Lasso
  6. from sklearn.linear_model import SGDRegressor # 随机梯度下降
  7. X = np.random.rand(100,1)
  8. y = 4 + 3*X + np.random.randn(100,1)
  9. # lasso_reg = Lasso(alpha=0.04,max_iter=30000)
  10. # lasso_reg.fit(X,y)
  11. # print(lasso_reg.predict([[1.5]]))
  12. # print(lasso_reg.intercept_) # 查看截距项W0
  13. # print(lasso_reg.coef_) # 查看其他的参数 W1
  14. sgd_reg = SGDRegressor(penalty='l1',max_iter=30000)
  15. # sgd_reg.fit(X,y.ravel())
  16. sgd_reg.fit(X,y.reshape(-1,))
  17. print(sgd_reg.predict([[1.5]]))
  18. print(sgd_reg.intercept_)
  19. print(sgd_reg.coef_)

六、ridge岭回归

  1. """
  2. ridge岭回归 损失函数+L2正则项
  3. Ridge(alpha=0.4, solver='sag')
  4. alpha : L2 正则项系数
  5. solver : 梯度训练方法
  6. """
  7. import numpy as np
  8. from sklearn.linear_model import Ridge
  9. from sklearn.linear_model import SGDRegressor # 随机梯度下降
  10. X = np.random.rand(100,1)
  11. y = 4 + 3*X +np.random.randn(100,1) # 真实值
  12. # # 创建Ridge岭对象
  13. # ridge_reg = Ridge(alpha=0.4, solver='sag')
  14. # ridge_reg.fit(X,y) # 把训练集里面的对象 训练好
  15. # print(ridge_reg.predict([[1.5]])) # 预测值
  16. # print(ridge_reg.intercept_) # 获取截距项 W0
  17. # print(ridge_reg.coef_) # 其他系数 W1
  18. # 创建SGDRegressor 对象
  19. sgd_reg = SGDRegressor(penalty='l2',max_iter=1000)
  20. sgd_reg.fit(X,y)
  21. print(sgd_reg.predict([[1.5]]))
  22. print(sgd_reg.intercept_)
  23. print(sgd_reg.coef_)

七、弹性网络回归

  1. """
  2. 损失函数 + L1 正则项+L2正则项
  3. """
  4. import numpy as np
  5. from sklearn.linear_model import ElasticNet
  6. from sklearn.linear_model import SGDRegressor # 随机梯度下降
  7. X = np.random.rand(100,1)
  8. y = 4 + 3*X + np.random.randn(100,1)
  9. # elastic_reg = ElasticNet(alpha=0.04,max_iter=100000,l1_ratio=0.15) # l1_ratio 指的是权衡L1 L2正则项哪个重要
  10. # elastic_reg.fit(X,y)
  11. # print(elastic_reg.predict([[1.5]]))
  12. # print(elastic_reg.intercept_)
  13. # print(elastic_reg.coef_)
  14. sgd_reg = SGDRegressor(penalty='elasticnet',max_iter=30000)
  15. sgd_reg.fit(X,y)
  16. print(sgd_reg.predict([[1.5]]))
  17. print(sgd_reg.intercept_)
  18. print(sgd_reg.coef_)

八、多项式回归 升维(对特征的预处理)

  1. """
  2. 多项式回归 升维
  3. """
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. from sklearn.preprocessing import PolynomialFeatures # 对特征进行预处理
  7. from sklearn.linear_model import LinearRegression
  8. from sklearn.metrics import mean_squared_error # 回归评估指标 mse ;评估升维的效果
  9. np.random.seed(42) # 随机种子 目的 :运行多次 数据是一样的
  10. m =100 # 样本
  11. X = 6*np.random.rand(m,1) -3
  12. y = 0.5*X**2 +X +2 + np.random.randn(m,1)
  13. # # 画图
  14. plt.plot(X,y,'b.')
  15. # 训练集
  16. X_train = X[:80]
  17. y_train = y[:80]
  18. # 测试集
  19. X_test =X[80:]
  20. y_test = y[80:]
  21. d = {1: 'g-', 2:'r+', 10:'y*'}
  22. for i in d:
  23. # 把训练集和测试集升维多项式回归
  24. poly_features = PolynomialFeatures(degree=i, include_bias=True) # include_bias 是否创建截距项
  25. X_poly_train = poly_features.fit_transform(X_train)
  26. X_poly_test = poly_features.fit_transform(X_test)
  27. print(X_train[0])
  28. print(X_poly_train[0])
  29. print(X_train.shape)
  30. print(X_poly_train.shape)
  31. # 创建模型
  32. lin_reg = LinearRegression(fit_intercept=False) # fit_intercept 是否计算截距
  33. lin_reg.fit(X_poly_train,y_train)
  34. print(lin_reg.intercept_,lin_reg.coef_)
  35. # 看看是否随着degree 的增加升维,是否过拟合了
  36. y_train_predict = lin_reg.predict(X_poly_train)
  37. y_test_predict = lin_reg.predict(X_poly_test)
  38. plt.plot(X_poly_train[:,1],y_train_predict,d[i])
  39. print(mean_squared_error(y_test,y_test_predict))
  40. print(mean_squared_error(y_train,y_train_predict))
  41. # plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/647552
推荐阅读
相关标签
  

闽ICP备14008679号