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

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

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

      高斯判別分析GDA推導與代碼實現

      高斯判別分析GDA推導與代碼實現

      生成學習

      處理分類問題,我們可以使用邏輯回歸、Softmax。這兩種方法都屬于“判別學習”,也就是給定 \((x^{(i)}, y^{(i)})\),我們學習 \(P(y|x)\),并對于給定的 \(x\),計算 \(\operatorname{argmax}_{y}\{P(y|x)\}\)

      GDA屬于另一種方法——生成學習。在判別學習中,我們并不關注 \(x\) 本身的分布,而在生成學習中,我們基于一些事實假設 \(x\) 的分布,例如在GDA中,我們假設對于相同的 \(y\)\(x\) 符合高斯分布。然后基于假設,學習 \(P(x|y)\) 的參數(高斯分布則學習均值 \(\mu\) 和協方差 \(\Sigma\)),以及 \(P(y)\) 的參數(例如兩點分布的 \(\phi\)),從而得到聯合概率 \(P(x,y)\)。在預測時,我們仍然是找到最大的 \(P(y|x)\),但是是用貝葉斯公式計算:

      \[P(y|x) = \frac{P(x,y)}{P(x)} \]

      高斯判別分析

      作出的假設

      首先假設 \(Y\) 服從兩點分布 \(Bernolli(\phi)\),于是可以寫作 \(P(y)=\phi^{y}(1-\phi)^{1-y}\)

      (盡管可以直接用協方差定義多元變量的高斯分布,但是這里采用另一種方法,在特殊的情況下得到等式而不需要完全理解協方差矩陣。)

      然后假設給定 \(y\) 后,\(x\)每一個分量 \(x_i\) 都服從高斯分布且相互獨立。不妨設 \(y=0\),即 \(x_i|y=0\sim N(\mu_i,\sigma_i)\)

      \[P(x_i|y=0)=\frac{1}{\sqrt{2\pi}\sigma_i}\exp\left(-\frac{(x_i-\mu_i)^2}{2\sigma_i^2}\right) \]

      \(x_i\) 相互獨立,可以得到:

      \[\begin{aligned} P(x|y=0)&=\prod_{i=1}^n\frac{1}{\sqrt{2\pi}\sigma_i}\exp\left(-\frac{(x_i-\mu_i)^2}{2\sigma_i^2}\right)\\ &=\frac{1}{(2\pi)^{\frac{n}{2}}\sigma_1\dots\sigma_n}\exp\left(-\frac{1}{2}\sum_{i=1}^n\frac{(x_i-\mu_i)^2}{\sigma_i^2}\right)\\ \end{aligned} \]

      我們定義矩陣 \(\Sigma=\begin{pmatrix}\sigma_1^2\\&\ddots\\&&\sigma_n^2\end{pmatrix}\),可以將上式化簡:

      \[P(x|y=0)=\frac{1}{(2\pi)^{\frac{n}{2}}|\Sigma|^{\frac{1}{2}}}\exp\left(-\frac{1}{2}(x-\mu)\Sigma^{-1}(x-\mu)^{T}\right) \]

      同樣,我們也假設 \(x|y=1\) 符合高斯分布 \(N(\mu',\Sigma)\),需要注意的是,兩個分布都采用了同一個 \(\Sigma\)(存疑,不知道目的)。

      但是實際上GDA并沒有假設 \(\Sigma\)

      最大似然估計

      在判別學習中,我們以 \(P(y^{(i)}\mid x^{i})\) 為似然函數,而在GDA這一類生成學習中,我們以聯合概率 \(P(x^{(i)},y^{(i)})\) 為似然函數。也即最大化如下對數似然函數:

      \[\begin{aligned} \mathcal{L}(\phi,\mu,\mu',\Sigma)&=\ln\prod_{i=1}^{m}P(x^{(i)},y^{(i)};\phi,\mu,\mu',\Sigma)\\ &=\ln\prod_{i=1}^{m}P(x^{(i)}\mid y^{(i)};\mu,\mu',\Sigma)P(y^{(i)};\phi)\\ &=\sum_{i=1}^{m}\ln P(x^{(i)}\mid y^{(i)};\mu,\mu',\Sigma)+\sum_{i=1}^m\ln P(y^{(i)};\phi) \end{aligned} \]

      不同于邏輯回歸,我們可以直接用導數為 \(0\) 求解參數。

      計算 \(\phi\)

      \[\begin{aligned} \frac{\partial \mathcal{L}}{\partial \phi}&=\frac{\partial}{\partial\phi}\sum_{i=1}^m\ln P(y^{(i)};\phi)\\ &=\frac{\partial}{\partial\phi}\sum_{i=1}^my^{(i)}\ln\phi+(1-y^{(i)})\ln(1-\phi)\\ &=\sum_{i=1}^m\frac{y^{(i)}}{\phi}-\frac{1-y^{(i)}}{1-\phi} \end{aligned} \]

      令上式為 \(0\),得 \(\phi=\frac{\sum y^{(i)}}{m}\)

      計算 \(\mu,\mu'\)

      一些無關緊要的常數用 \(C\) 代替,比如密度函數中的系數。

      \[\begin{aligned} \nabla_{\mu}\mathcal{L}&=\nabla_{\mu}\sum_{i=1}^m(1-y^{(i)})\ln P(x^{(i)}\mid y=0;\mu,\Sigma)+y^{(i)}\ln P(x^{(i)}\mid y=1;\mu',\Sigma) \end{aligned} \]

      其中

      \[\begin{aligned} \frac{\partial}{\partial \mu_j}\ln P(x^{(i)}\mid y=0;\mu,\Sigma)&=\frac{\partial}{\partial \mu_j}\left(C-\frac{1}{2}\ln|\Sigma|-\frac{1}{2}(x^{(i)}-\mu)\Sigma^{-1}(x^{(i)}-\mu)^T\right)\\ &=x^{(i)}_j-\mu_j \end{aligned} \]

      \(\nabla_{\mu}\ln P(x^{(i)}\mid y=0;\mu,\Sigma)=x^{(i)}-\mu\),進而

      \[\nabla_{\mu}\mathcal{L}=\sum_{i=1}^m(1-y^{(i)})(x^{(i)}-\mu) \]

      令上式為 \(0\),可得 \(\mu=\frac{\sum(1-y^{(i)})x^{(i)}}{\sum 1-y^{(i)}}\),同理可得 \(\mu'=\frac{\sum y^{(i)}x^{(i)}}{\sum y^{(i)}}\)

      計算 \(\Sigma\)

      下面用到了兩個 \(\nabla\) 算符的性質:

      • \(\nabla_{\Sigma}|\Sigma|=|\Sigma|\Sigma^{-1}\)
      • \(\nabla_{\Sigma}\Sigma^{-1}=-\Sigma^{-2}\)

      \[\begin{aligned} \nabla_{\Sigma}\mathcal{L}&=\sum_{i=1}^m-\frac{1}{2|\Sigma|}\cdot\nabla_{\Sigma}|\Sigma|+\frac{1}{2}\nabla_{\Sigma}\left((x^{(i)}-\mu)\Sigma^{-1}(x^{(i)}-\mu)^{T}\right)\\ &=\sum_{i=1}^m-\frac{1}{2}\Sigma^{-1}+\frac{1}{2}(x^{(i)}-\mu)^T(x^{(i)}-\mu)\Sigma^{-2} \end{aligned} \]

      同樣地令上式為 \(0\),計算得

      \[\Sigma=\frac{1}{m}\sum_{i=1}^m(x^{(i)}-\mu)^T(x^{(i)}-\mu) \]

      注意到,按照我們的假設,\(\Sigma\) 應該是一個對角矩陣(如果了解協方差矩陣的話,由 \(x_i\) 相互獨立,可以推出 \(\Sigma\) 應該是對角矩陣,對角元就是每個變量的方差),但是這里非常顯然不總是對角矩陣。

      (以下僅是我個人的猜測)在GDA的實現中,我們并沒有關注 \(x_i\) 相互獨立的性質,而是直接學習了一個普遍的協方差矩陣。實際上這種定義的限制更低,更符合現實情況(現實中的變量之間存在聯系比較普遍)。

      代碼實現

      直接計算這幾個參數的代碼不需要解釋:

      m, n = xs.shape
      # Calculate mu
      self.mu = np.zeros((2, n))
      classes_size = np.zeros(2)
      for i in range(m):
          self.mu[ys[i]] += xs[i]
          classes_size[ys[i]] += 1
      self.mu /= np.transpose([classes_size])
      # Calculate Sigma
      self.sigma = np.zeros((n, n))
      for i in range(m):
          temp_array = xs[i] - self.mu[ys[i]]
          self.sigma += np.dot(temp_array.reshape(n, 1), temp_array.reshape(1, n))
      self.sigma /= m
      # Calculate phi
      self.phi = np.sum(ys) / m
      

      最后我們發現計算概率需要計算 \(\Sigma^{-1}\),然而我們算出來的可能是一個奇異矩陣。這時候可以對 \(\Sigma\) 進行微擾——將對角元加上一個較小的偏差。

      最后我們對 \(y=0,1\) 分別計算出 \(P(x|y)\)

      \[P(x|y;\mu,\Sigma)=\frac{1}{(2\pi)^{\frac{n}{2}}|\Sigma|^{\frac{1}{2}}}\cdot\exp\left(-\frac{(x-\mu)\Sigma^{-1}(x-\mu)^T}{2}\right) \]

      但是實際上比較 \(P(x|y=0),P(x|y=1)\) 不需要真正計算出概率,而是比較兩者不同的地方,也就是后面的 \(\exp\)

      (奇異矩陣的處理參考 https://blog.csdn.net/qq_30091945/article/details/81508055 ,對其中的 Gaussian 函數有修改)

      最后是實現的一個類:

      class GaussianDiscriminantAnalysis:
          def __init__(self):
              self.mu = None
              self.phi = None
              self.sigma = None
      
          def fit(self, xs, ys, **others):
              m, n = xs.shape
              # Calculate mu
              self.mu = np.zeros((2, n))
              classes_size = np.zeros(2)
              for i in range(m):
                  self.mu[ys[i]] += xs[i]
                  classes_size[ys[i]] += 1
              self.mu /= np.transpose([classes_size])
              # Calculate Sigma
              self.sigma = np.zeros((n, n))
              for i in range(m):
                  temp_array = xs[i] - self.mu[ys[i]]
                  self.sigma += np.dot(temp_array.reshape(n, 1), temp_array.reshape(1, n))
              self.sigma /= m
              # Calculate phi
              self.phi = np.sum(ys) / m
      
          def evaluate(self, x, mean, cov):
              dim = np.shape(cov)[0]
              # cov的行列式為零時的措施
              cov_inv = np.linalg.inv(cov + np.eye(dim) * 0.001)
              xdiff = (x - mean).reshape((1, dim))
              # 概率密度
              prob = np.exp(-0.5 * xdiff.dot(cov_inv).dot(xdiff.T))[0][0]
              return prob
      
          def predict(self, xs):
              predict = []
              for x in xs:
                  evaluate_0 = self.evaluate(x, self.mu[0], self.sigma) * (1 - self.phi)
                  evaluate_1 = self.evaluate(x, self.mu[1], self.sigma) * self.phi
                  if evaluate_0 > evaluate_1:
                      predict.append(0)
                  else:
                      predict.append(1)
              return predict
      
      posted @ 2023-02-27 14:13  Lucky_Glass  閱讀(241)  評論(0)    收藏  舉報
      TOP BOTTOM
      主站蜘蛛池模板: 亚洲精品国偷自产在线| 国产一区二区在线影院| 亚洲a毛片| 精品久久精品午夜精品久久| 欧美一区二区三区欧美日韩亚洲 | 亚洲av无码成人精品区一区| 亚洲一级特黄大片在线观看 | 中文字幕在线国产精品| 无码国产偷倩在线播放| 五月综合网亚洲乱妇久久| 日韩免费无码视频一区二区三区| 久久96热人妻偷产精品| 国产精品久久久福利| 韩国 日本 亚洲 国产 不卡| 喀喇| 亚洲精品一区二区三天美| 亚洲国产精品一区二区第一页| 99久久国产成人免费网站| 日韩区二区三区中文字幕| 亚洲精品日韩在线丰满| 四虎影视库国产精品一区| 欧美一区二区| 日韩av毛片福利国产福利| 成人av午夜在线观看| jizzjizz日本高潮喷水| 一亚洲一区二区中文字幕| 欧美疯狂三p群体交乱视频| 亚洲精品一区二区三区婷婷月| 国产成人综合在线女婷五月99播放| 国产一区二区三区色视频| 亚洲情A成黄在线观看动漫尤物| 午夜成人性爽爽免费视频| 91孕妇精品一区二区三区| 国语自产少妇精品视频蜜桃| 亚洲一区二区约美女探花| 国产av永久无码天堂影院| 青草成人精品视频在线看| 中文字幕亚洲制服在线看| 国产精品无码一区二区三区电影| 伊人色综合九久久天天蜜桃| 两个人看的www免费视频中文|