<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      用C#實現最小二乘法(用OxyPlot繪圖)?

      最小二乘法介紹?

      最小二乘法(Least Squares Method)是一種常見的數學優化技術,廣泛應用于數據擬合、回歸分析和參數估計等領域。其目標是通過最小化殘差平方和來找到一組參數,使得模型預測值與觀測值之間的差異最小化。

      最小二乘法的原理?

      線性回歸模型將因變量 (y) 與至少一個自變量 (x) 之間的關系建立為:

      image-20240118105946580

      在 OLS 方法中,我們必須選擇一個b1和b0的值,以便將 y 的實際值和擬合值之間的差值的平方和最小化。

      平方和的公式如下:

      image-20240118110247858

      我們可以把它看成是一個關于b1和b0的函數,分別對b1和b0求偏導,然后讓偏導等于0,就可以得到最小平方和對應的b1和b0的值。

      先說結果,斜率最后推導出來如下所示:

      截距推導出來結果如下:

      don't worry about that,慢慢推導總是可以弄明白的(不感興趣可以直接略過):

      最小二乘法推導1

      最小二乘法推導2

      最小二乘法推導3

      用C#實現最小二乘法?

      創建數據點?

      首先創建想要擬合的數據點:

       NDArray? x, y;

      x,y為全局變量。

        //使用NumSharp創建線性回歸的數據集
       x = np.arange(0, 10, 0.2);
       y = 2 * x + 3 + np.random.normal(0, 3, x.size);

      使用到了NumSharp,需要為項目添加NumSharp包:

      image-20240120100221733

       x = np.arange(0, 10, 0.2);

      的意思是x從0增加到10(不包含10),步長為0.2:

      image-20240120100455351

      np.random.normal(0, 3, x.size);

      的意思是生成了一個均值為0,標準差為3,數量與x數組長度相同的正態分布隨機數數組。這個數組被用作線性回歸數據的噪聲。

      使用OxyPlot畫散點圖?

      OxyPlot是一個用于在.NET應用程序中創建數據可視化圖表的開源圖表庫。它提供了豐富的功能和靈活性,使開發者能夠輕松地在其應用程序中集成各種類型的圖表,包括折線圖、柱狀圖、餅圖等。

      image-20240120101110294

      添加OxyPlot.WindowsForms包:

      image-20240120101228438

      將PlotView控件添加到窗體設計器上:

      image-20240120101340414

      // 初始化散點圖數據
      var scatterSeries = new ScatterSeries
      {
         MarkerType = MarkerType.Circle,
         MarkerSize = 5,
         MarkerFill = OxyColors.Blue
      };

      表示標志為圓形,標志用藍色填充,標志的大小為5。

        for (int i = 0; i < x.size; i++)
      {
           scatterSeries.Points.Add(new ScatterPoint(x[i], y[i]));
      }

      添加數據點。

       PlotModel? plotModel;

      將plotModel設置為全局變量。

       // 創建 PlotModel
      plotModel = new PlotModel()
      {
          Title = "散點圖"
      };
      plotModel.Series.Add(scatterSeries);
      ?
      // 將 PlotModel 設置到 PlotView
      plotView1.Model = plotModel;

      這樣就成功繪制了散點圖,效果如下所示:

      image-20240120102920929

      使用最小二乘法擬合數據點?

      double a = 0;
      double c = 0;
      ?
      double x_mean = x?.mean();
      double y_mean = y?.mean();
      ?
      //計算a和c
      for(int i = 0; i < x?.size; i++)
      {
         a += (x[i] - x_mean) * (y?[i] - y_mean);
         c += (x[i] - x_mean) * (x[i] - x_mean);
      }
      ?
      //計算斜率和截距
      double m = a / c;
      double b = y_mean - m * x_mean;
      ?
      //擬合的直線
      var y2 = m * x + b;

      套用公式就可以,a表示上面斜率公式的上面那部分,c表示上面斜率公式的下面那部分。

      double x_mean = x?.mean();
      double y_mean = y?.mean();

      計算x與y的平均值。

      使用OxyPlot畫擬合出來的直線?

       //畫這條直線         
      var lineSeries = new LineSeries
      {
          Points = { new DataPoint(x?[0], y2[0]), new DataPoint(x?[-1], y2[-1]) },
          Color = OxyColors.Red
      };
      ?
      // 創建 PlotModel        
      plotModel?.Series.Add(lineSeries);
      ?
      // 為圖表添加標題
      if (plotModel != null)
      {
          plotModel.Title = $"擬合的直線 y = {m:0.00}x + {b:0.00}";
      }
      ?
      // 刷新 PlotView
      plotView1.InvalidatePlot(true);
       Points = { new DataPoint(x?[0], y2[0]), new DataPoint(x?[-1], y2[-1]) },

      畫直線只要添加兩個點就好了x?[0], y2[0]表示x和y的第一個點,x?[-1], y2[-1])表示x和y的最后一個點,使用了NumSharp的切片語法。

      畫出來的效果如下所示:

      image-20240120103737259

      C#實現的全部代碼:

      using NumSharp;
      using OxyPlot.Series;
      using OxyPlot;
      namespace OlsRegressionDemoUsingWinform
      {
         public partial class Form1 : Form
        {
             NDArray? x, y;
             PlotModel? plotModel;
             public Form1()
            {
                 InitializeComponent();
            }
      ?
             private void button1_Click(object sender, EventArgs e)
            {
                 //使用NumSharp創建線性回歸的數據集
                 x = np.arange(0, 10, 0.2);
                 y = 2 * x + 3 + np.random.normal(0, 3, x.size);
      ?
                 // 初始化散點圖數據
                 var scatterSeries = new ScatterSeries
                {
                     MarkerType = MarkerType.Circle,
                     MarkerSize = 5,
                     MarkerFill = OxyColors.Blue
                };
      ?
                 for (int i = 0; i < x.size; i++)
                {
                     scatterSeries.Points.Add(new ScatterPoint(x[i], y[i]));
                }
      ?
                 // 創建 PlotModel
                 plotModel = new PlotModel()
                {
                     Title = "散點圖"
                };
                 plotModel.Series.Add(scatterSeries);
      ?
                 // 將 PlotModel 設置到 PlotView
                 plotView1.Model = plotModel;
      ?
      ?
      ?
      ?
            }
      ?
             private void button2_Click(object sender, EventArgs e)
            {
                 double a = 0;
                 double c = 0;
      ?
                 double x_mean = x?.mean();
                 double y_mean = y?.mean();
      ?
                 //計算a和c
                 for(int i = 0; i < x?.size; i++)
                {
                     a += (x[i] - x_mean) * (y?[i] - y_mean);
                     c += (x[i] - x_mean) * (x[i] - x_mean);
                }
      ?
                 //計算斜率和截距
                 double m = a / c;
                 double b = y_mean - m * x_mean;
      ?
                 //擬合的直線
                 var y2 = m * x + b;
      ?
                 //畫這條直線        
                 var lineSeries = new LineSeries
                {
                     Points = { new DataPoint(x?[0], y2[0]), new DataPoint(x?[-1], y2[-1]) },
                     Color = OxyColors.Red
                };
      ?
                 // 創建 PlotModel        
                 plotModel?.Series.Add(lineSeries);
      ?
                 // 為圖表添加標題
                 if (plotModel != null)
                {
                     plotModel.Title = $"擬合的直線 y = {m:0.00}x + {b:0.00}";
                }
               
                 // 刷新 PlotView
                 plotView1.InvalidatePlot(true);
      ?
            }
        }
      }

      用Python實現最小二乘法?

      import numpy as np
      import matplotlib.pyplot as plt
      ?
      # 用最小二乘法擬合 y = mx + b
      ?
      # 設置隨機數種子以保證結果的可復現性
      np.random.seed(0)
      ?
      # 生成一個在[0, 10]區間內均勻分布的100個數作為x
      x = np.linspace(0, 10, 100)
      ?
      # 生成y,y = 2x + 噪聲,其中噪聲是[0, 10)之間的隨機整數
      y = 2 * x + 5 + np.random.randint(0, 10, size=100)
      ?
      # 計算x和y的均值
      x_mean = np.mean(x)
      y_mean = np.mean(y)
      ?
      a = 0
      c = 0
      ?
      for i in range(x.shape[0]):
        a += (x[i] - x_mean) * (y[i] - y_mean)
        c += (x[i] - x_mean) ** 2
      ?
      # 計算斜率和截距
      m = a / c
      b = y_mean - m * x_mean
       
      # 畫這條直線
      y2 = m * x + b
      plt.plot(x, y2, color='red')
      ?
      # 畫數據點
      plt.scatter(x, y)
      plt.xlabel('x')
      plt.ylabel('y')
      plt.title(f'y = {m:.2f}x + {b:.2f}')
      plt.show()

      運行效果如下所示:

      image-20240120104300224

      總結?

      本文向大家介紹了最小二乘法以及公式推導的過程,并使用C#與Python進行實現。重點介紹了C#中是如何實現的,同時介紹了在C#中如何使用OxyPlot繪圖。希望對你有所幫助。

      參考?

      1、Understanding Ordinary Least Squares (OLS) Regression | Built In

      2、Machine Learning Series-Linear Regression Ordinary Least Square Method - YouTube

       
      posted @ 2024-01-20 11:27  mingupupup  閱讀(2092)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 德钦县| 国产成人精品无码免费看| 久久婷婷五月综合色一区二区| 久久精品人妻无码一区二区三区| 亚洲精品码中文在线观看| 亚洲精品777| 蜜臀av久久国产午夜| 久久美女夜夜骚骚免费视频| 99福利一区二区视频| 欧美性色黄大片| 国产不卡一区二区在线视频| 无码精品人妻一区二区三区中| 国产午夜福利精品视频| 天堂www在线中文| 日韩精品中文字幕一线不卡| 色伦专区97中文字幕| 国产精品日日摸夜夜添夜夜添无码 | 闸北区| 国产成人综合色视频精品| 国产综合视频一区二区三区| 人妻中文字幕不卡精品| 精品偷拍被偷拍在线观看| 成人三级视频在线观看不卡| 米易县| 起碰免费公开97在线视频| 中文字幕有码无码AV| 男女性杂交内射女bbwxz| 国产成人AV男人的天堂| 色吊丝一区二区中文字幕| 中文字幕日韩国产精品| 精品人妻伦九区久久69| 亚洲有无码中文网| 日韩人妻少妇一区二区三区| 国产精品一区二区传媒蜜臀 | 1000部拍拍拍18勿入免费视频| 国产精品美女久久久久久麻豆| 国产日产免费高清欧美一区| 特黄三级又爽又粗又大| 国产一二三五区不在卡| 精品久久综合日本久久网| 日本国产精品第一页久久|