亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python em算法的實(shí)現(xiàn)

 更新時(shí)間:2020年10月03日 12:15:57   作者:返回主頁(yè)chenxiangzhen  
這篇文章主要介紹了python em算法的實(shí)現(xiàn),幫助大家更好的理解機(jī)器學(xué)習(xí),感興趣的朋友可以了解下
'''
數(shù)據(jù)集:偽造數(shù)據(jù)集(兩個(gè)高斯分布混合)
數(shù)據(jù)集長(zhǎng)度:1000
------------------------------
運(yùn)行結(jié)果:
----------------------------
the Parameters set is:
alpha0:0.3, mu0:0.7, sigmod0:-2.0, alpha1:0.5, mu1:0.5, sigmod1:1.0
----------------------------
the Parameters predict is:
alpha0:0.4, mu0:0.6, sigmod0:-1.7, alpha1:0.7, mu1:0.7, sigmod1:0.9
----------------------------
'''

import numpy as np
import random
import math
import time

def loadData(mu0, sigma0, mu1, sigma1, alpha0, alpha1):
  '''
  初始化數(shù)據(jù)集
  這里通過(guò)服從高斯分布的隨機(jī)函數(shù)來(lái)偽造數(shù)據(jù)集
  :param mu0: 高斯0的均值
  :param sigma0: 高斯0的方差
  :param mu1: 高斯1的均值
  :param sigma1: 高斯1的方差
  :param alpha0: 高斯0的系數(shù)
  :param alpha1: 高斯1的系數(shù)
  :return: 混合了兩個(gè)高斯分布的數(shù)據(jù)
  '''
  # 定義數(shù)據(jù)集長(zhǎng)度為1000
  length = 1000

  # 初始化第一個(gè)高斯分布,生成數(shù)據(jù),數(shù)據(jù)長(zhǎng)度為length * alpha系數(shù),以此來(lái)
  # 滿足alpha的作用
  data0 = np.random.normal(mu0, sigma0, int(length * alpha0))
  # 第二個(gè)高斯分布的數(shù)據(jù)
  data1 = np.random.normal(mu1, sigma1, int(length * alpha1))

  # 初始化總數(shù)據(jù)集
  # 兩個(gè)高斯分布的數(shù)據(jù)混合后會(huì)放在該數(shù)據(jù)集中返回
  dataSet = []
  # 將第一個(gè)數(shù)據(jù)集的內(nèi)容添加進(jìn)去
  dataSet.extend(data0)
  # 添加第二個(gè)數(shù)據(jù)集的數(shù)據(jù)
  dataSet.extend(data1)
  # 對(duì)總的數(shù)據(jù)集進(jìn)行打亂(其實(shí)不打亂也沒事,只不過(guò)打亂一下直觀上讓人感覺已經(jīng)混合了
  # 讀者可以將下面這句話屏蔽以后看看效果是否有差別)
  random.shuffle(dataSet)

  #返回偽造好的數(shù)據(jù)集
  return dataSet

def calcGauss(dataSetArr, mu, sigmod):
  '''
  根據(jù)高斯密度函數(shù)計(jì)算值
  依據(jù):“9.3.1 高斯混合模型” 式9.25
  注:在公式中y是一個(gè)實(shí)數(shù),但是在EM算法中(見算法9.2的E步),需要對(duì)每個(gè)j
  都求一次yjk,在本實(shí)例中有1000個(gè)可觀測(cè)數(shù)據(jù),因此需要計(jì)算1000次??紤]到
  在E步時(shí)進(jìn)行1000次高斯計(jì)算,程序上比較不簡(jiǎn)潔,因此這里的y是向量,在numpy
  的exp中如果exp內(nèi)部值為向量,則對(duì)向量中每個(gè)值進(jìn)行exp,輸出仍是向量的形式。
  所以使用向量的形式1次計(jì)算即可將所有計(jì)算結(jié)果得出,程序上較為簡(jiǎn)潔
  :param dataSetArr: 可觀測(cè)數(shù)據(jù)集
  :param mu: 均值
  :param sigmod: 方差
  :return: 整個(gè)可觀測(cè)數(shù)據(jù)集的高斯分布密度(向量形式)
  '''
  # 計(jì)算過(guò)程就是依據(jù)式9.25寫的,沒有別的花樣
  result = (1 / (math.sqrt(2*math.pi)*sigmod**2)) * np.exp(-1 * (dataSetArr-mu) * (dataSetArr-mu) / (2*sigmod**2))
  # 返回結(jié)果
  return result


def E_step(dataSetArr, alpha0, mu0, sigmod0, alpha1, mu1, sigmod1):
  '''
  EM算法中的E步
  依據(jù)當(dāng)前模型參數(shù),計(jì)算分模型k對(duì)觀數(shù)據(jù)y的響應(yīng)度
  :param dataSetArr: 可觀測(cè)數(shù)據(jù)y
  :param alpha0: 高斯模型0的系數(shù)
  :param mu0: 高斯模型0的均值
  :param sigmod0: 高斯模型0的方差
  :param alpha1: 高斯模型1的系數(shù)
  :param mu1: 高斯模型1的均值
  :param sigmod1: 高斯模型1的方差
  :return: 兩個(gè)模型各自的響應(yīng)度
  '''
  # 計(jì)算y0的響應(yīng)度
  # 先計(jì)算模型0的響應(yīng)度的分子
  gamma0 = alpha0 * calcGauss(dataSetArr, mu0, sigmod0)
  # 模型1響應(yīng)度的分子
  gamma1 = alpha1 * calcGauss(dataSetArr, mu1, sigmod1)

  # 兩者相加為E步中的分布
  sum = gamma0 + gamma1
  # 各自相除,得到兩個(gè)模型的響應(yīng)度
  gamma0 = gamma0 / sum
  gamma1 = gamma1 / sum

  # 返回兩個(gè)模型響應(yīng)度
  return gamma0, gamma1

def M_step(muo, mu1, gamma0, gamma1, dataSetArr):
  # 依據(jù)算法9.2計(jì)算各個(gè)值
  # 這里沒什么花樣,對(duì)照書本公式看看這里就好了
  mu0_new = np.dot(gamma0, dataSetArr) / np.sum(gamma0)
  mu1_new = np.dot(gamma1, dataSetArr) / np.sum(gamma1)

  sigmod0_new = math.sqrt(np.dot(gamma0, (dataSetArr - muo)**2) / np.sum(gamma0))
  sigmod1_new = math.sqrt(np.dot(gamma1, (dataSetArr - mu1)**2) / np.sum(gamma1))

  alpha0_new = np.sum(gamma0) / len(gamma0)
  alpha1_new = np.sum(gamma1) / len(gamma1)

  # 將更新的值返回
  return mu0_new, mu1_new, sigmod0_new, sigmod1_new, alpha0_new, alpha1_new


def EM_Train(dataSetList, iter=500):
  '''
  根據(jù)EM算法進(jìn)行參數(shù)估計(jì)
  算法依據(jù)“9.3.2 高斯混合模型參數(shù)估計(jì)的EM算法” 算法9.2
  :param dataSetList:數(shù)據(jù)集(可觀測(cè)數(shù)據(jù))
  :param iter: 迭代次數(shù)
  :return: 估計(jì)的參數(shù)
  '''
  # 將可觀測(cè)數(shù)據(jù)y轉(zhuǎn)換為數(shù)組形式,主要是為了方便后續(xù)運(yùn)算
  dataSetArr = np.array(dataSetList)

  # 步驟1:對(duì)參數(shù)取初值,開始迭代
  alpha0 = 0.5
  mu0 = 0
  sigmod0 = 1
  alpha1 = 0.5
  mu1 = 1
  sigmod1 = 1

  # 開始迭代
  step = 0
  while (step < iter):
    # 每次進(jìn)入一次迭代后迭代次數(shù)加1
    step += 1
    # 步驟2:E步:依據(jù)當(dāng)前模型參數(shù),計(jì)算分模型k對(duì)觀測(cè)數(shù)據(jù)y的響應(yīng)度
    gamma0, gamma1 = E_step(dataSetArr, alpha0, mu0, sigmod0, alpha1, mu1, sigmod1)
    # 步驟3:M步
    mu0, mu1, sigmod0, sigmod1, alpha0, alpha1 = M_step(mu0, mu1, gamma0, gamma1, dataSetArr)

  # 迭代結(jié)束后將更新后的各參數(shù)返回
  return alpha0, mu0, sigmod0, alpha1, mu1, sigmod1


if __name__ == '__main__':
  start = time.time()

  # 設(shè)置兩個(gè)高斯模型進(jìn)行混合,這里是初始化兩個(gè)模型各自的參數(shù)
  # 見“9.3 EM算法在高斯混合模型學(xué)習(xí)中的應(yīng)用”
  # alpha是“9.3.1 高斯混合模型” 定義9.2中的系數(shù)α
  # mu0是均值μ
  # sigmod是方差σ
  # 在設(shè)置上兩個(gè)alpha的和必須為1,其他沒有什么具體要求,符合高斯定義就可以
  alpha0 = 0.3 # 系數(shù)α
  mu0 = -2 # 均值μ
  sigmod0 = 0.5 # 方差σ

  alpha1 = 0.7 # 系數(shù)α
  mu1 = 0.5 # 均值μ
  sigmod1 = 1 # 方差σ

  # 初始化數(shù)據(jù)集
  dataSetList = loadData(mu0, sigmod0, mu1, sigmod1, alpha0, alpha1)

  #打印設(shè)置的參數(shù)
  print('---------------------------')
  print('the Parameters set is:')
  print('alpha0:%.1f, mu0:%.1f, sigmod0:%.1f, alpha1:%.1f, mu1:%.1f, sigmod1:%.1f' % (
    alpha0, alpha1, mu0, mu1, sigmod0, sigmod1
  ))

  # 開始EM算法,進(jìn)行參數(shù)估計(jì)
  alpha0, mu0, sigmod0, alpha1, mu1, sigmod1 = EM_Train(dataSetList)

  # 打印參數(shù)預(yù)測(cè)結(jié)果
  print('----------------------------')
  print('the Parameters predict is:')
  print('alpha0:%.1f, mu0:%.1f, sigmod0:%.1f, alpha1:%.1f, mu1:%.1f, sigmod1:%.1f' % (
    alpha0, alpha1, mu0, mu1, sigmod0, sigmod1
  ))

  # 打印時(shí)間
  print('----------------------------')
  print('time span:', time.time() - start)

以上就是python em算法的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于python em算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 對(duì)python多線程SSH登錄并發(fā)腳本詳解

    對(duì)python多線程SSH登錄并發(fā)腳本詳解

    今天小編就為大家分享一篇對(duì)python多線程SSH登錄并發(fā)腳本詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • 只用50行Python代碼爬取網(wǎng)絡(luò)美女高清圖片

    只用50行Python代碼爬取網(wǎng)絡(luò)美女高清圖片

    第一次寫文章,技術(shù)不成熟之處望各位大神輕噴,今天教大家只用50行Python代碼爬取網(wǎng)絡(luò)美女圖片是怎么操作的,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助哦,需要的朋友可以參考下
    2021-06-06
  • python海龜繪圖實(shí)例教程

    python海龜繪圖實(shí)例教程

    這篇文章主要介紹了python海龜繪圖實(shí)例教程,需要的朋友可以參考下
    2014-07-07
  • python提效小工具之統(tǒng)計(jì)xmind用例數(shù)量(源碼)

    python提效小工具之統(tǒng)計(jì)xmind用例數(shù)量(源碼)

    這篇文章主要介紹了python提效小工具之統(tǒng)計(jì)xmind用例數(shù)量,利用python開發(fā)小工具,實(shí)現(xiàn)同一份xmind文件中一個(gè)或多個(gè)sheet頁(yè)的用例數(shù)量統(tǒng)計(jì)功能,需要的朋友可以參考下
    2022-10-10
  • 詳解如何在cmd命令窗口中搭建簡(jiǎn)單的python開發(fā)環(huán)境

    詳解如何在cmd命令窗口中搭建簡(jiǎn)單的python開發(fā)環(huán)境

    這篇文章主要介紹了詳解如何在cmd命令窗口中搭建簡(jiǎn)單的python開發(fā)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 解決Pycharm界面的子窗口不見了的問(wèn)題

    解決Pycharm界面的子窗口不見了的問(wèn)題

    今天小編就為大家分享一篇解決Pycharm界面的子窗口不見了的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • python argparse模塊通過(guò)后臺(tái)傳遞參數(shù)實(shí)例

    python argparse模塊通過(guò)后臺(tái)傳遞參數(shù)實(shí)例

    這篇文章主要介紹了python argparse模塊通過(guò)后臺(tái)傳遞參數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • flask-socketio實(shí)現(xiàn)前后端實(shí)時(shí)通信的功能的示例

    flask-socketio實(shí)現(xiàn)前后端實(shí)時(shí)通信的功能的示例

    本文主要介紹了flask-socketio實(shí)現(xiàn)前后端實(shí)時(shí)通信的功能的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Python Faker批量生成測(cè)試數(shù)據(jù)的實(shí)現(xiàn)

    Python Faker批量生成測(cè)試數(shù)據(jù)的實(shí)現(xiàn)

    本文主要介紹了Python Faker批量生成測(cè)試數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • Python基礎(chǔ)之Socket通信原理

    Python基礎(chǔ)之Socket通信原理

    這篇文章主要介紹了Python基礎(chǔ)之Socket通信原理,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評(píng)論