专业敲bug的周郎 2021-05-17 17:56 采纳率: 0%
浏览 245
已结题

用 牛顿法进行参数估计,曲线拟合(python实现)

(最好是在实际问题背景下),给出一组数据集,和一个带有未知参数的方程,用牛顿法根据这组数据集来求方程中的参数,最好可以把每次迭代的曲线画出来。用python实现(需要源代码)。

  • 写回答

1条回答 默认 最新

  • 小P聊技术 2021-05-17 19:42
    关注
    import numpy as np
    
    class LogisticRegression(object):
     """
     Logistic Regression Classifier training by Newton Method
     """
    
     def __init__(self, error: float = 0.7, max_epoch: int = 100):
      """
      :param error: float, if the distance between new weight and 
          old weight is less than error, the process 
          of traing will break.
      :param max_epoch: if training epoch >= max_epoch the process 
           of traing will break.
      """
      self.error = error
      self.max_epoch = max_epoch
      self.weight = None
      self.sign = np.vectorize(lambda x: 1 if x >= 0.5 else 0)
    
     def p_func(self, X_):
      """Get P(y=1 | x)
      :param X_: shape = (n_samples + 1, n_features)
      :return: shape = (n_samples)
      """
      tmp = np.exp(self.weight @ X_.T)
      return tmp / (1 + tmp)
    
     def diff(self, X_, y, p):
      """Get derivative
      :param X_: shape = (n_samples, n_features + 1) 
      :param y: shape = (n_samples)
      :param p: shape = (n_samples) P(y=1 | x)
      :return: shape = (n_features + 1) first derivative
      """
      return -(y - p) @ X_
    
     def hess_mat(self, X_, p):
      """Get Hessian Matrix
      :param p: shape = (n_samples) P(y=1 | x)
      :return: shape = (n_features + 1, n_features + 1) second derivative
      """
      hess = np.zeros((X_.shape[1], X_.shape[1]))
      for i in range(X_.shape[0]):
       hess += self.X_XT[i] * p[i] * (1 - p[i])
      return hess
    
     def newton_method(self, X_, y):
      """Newton Method to calculate weight
      :param X_: shape = (n_samples + 1, n_features)
      :param y: shape = (n_samples)
      :return: None
      """
      self.weight = np.ones(X_.shape[1])
      self.X_XT = []
      for i in range(X_.shape[0]):
       t = X_[i, :].reshape((-1, 1))
       self.X_XT.append(t @ t.T)
    
      for _ in range(self.max_epoch):
       p = self.p_func(X_)
       diff = self.diff(X_, y, p)
       hess = self.hess_mat(X_, p)
       new_weight = self.weight - (np.linalg.inv(hess) @ diff.reshape((-1, 1))).flatten()
    
       if np.linalg.norm(new_weight - self.weight) <= self.error:
        break
       self.weight = new_weight
    
     def fit(self, X, y):
      """
      :param X_: shape = (n_samples, n_features)
      :param y: shape = (n_samples)
      :return: self
      """
      X_ = np.c_[np.ones(X.shape[0]), X]
      self.newton_method(X_, y)
      return self
    
     def predict(self, X) -> np.array:
      """
      :param X: shape = (n_samples, n_features] 
      :return: shape = (n_samples]
      """
      X_ = np.c_[np.ones(X.shape[0]), X]
      return self.sign(self.p_func(X_))
    import matplotlib.pyplot as plt
    import sklearn.datasets
    
    def plot_decision_boundary(pred_func, X, y, title=None):
     """分类器画图函数,可画出样本点和决策边界
     :param pred_func: predict函数
     :param X: 训练集X
     :param y: 训练集Y
     :return: None
     """
    
     # Set min and max values and give it some padding
     x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
     y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
     h = 0.01
     # Generate a grid of points with distance h between them
     xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
     # Predict the function value for the whole gid
     Z = pred_func(np.c_[xx.ravel(), yy.ravel()])
     Z = Z.reshape(xx.shape)
     # Plot the contour and training examples
     plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
     plt.scatter(X[:, 0], X[:, 1], s=40, c=y, cmap=plt.cm.Spectral)
     if title:
      plt.title(title)
     plt.show()
    评论

报告相同问题?

悬赏问题

  • ¥15 C语言使用vscode编码错误
  • ¥15 用KSV5转成本时,如何不生成那笔中间凭证
  • ¥20 ensp怎么配置让PC1和PC2通讯上
  • ¥50 有没有适合匹配类似图中的运动规律的图像处理算法
  • ¥15 dnat基础问题,本机发出,别人返回的包,不能命中
  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画
  • ¥15 hadoop中启动hive报错如下怎么解决