前向概率与隐马尔可夫模型的解码问题

前向概率与隐马尔可夫模型的解码问题

在机器学习和信号处理领域,隐马尔可夫模型(HMM)是一种广泛应用于时间序列数据的统计模型。它不仅可以用于序列的生成,还可以用于序列的解码。本文将介绍前向概率和隐马尔可夫模型的解码问题,并通过示例和代码进行说明,最后探讨其在语音模型(如降噪模型)中的应用。

一、前向概率

前向概率是隐马尔可夫模型中的一个重要概念,用于计算在给定观测序列的情况下,某个状态序列的概率。具体来说,前向概率表示在时间点 t t t 时,系统处于状态 S t S_t St 的概率,考虑到从初始状态到当前状态的所有可能路径。

前向算法的原理

前向算法的核心在于利用动态规划的思想,通过递归关系来计算前向概率。我们定义前向概率 α t ( i ) \alpha_t(i) αt(i) 为在时刻 t t t 处于状态 S i S_i Si 的概率,给定观测序列 O = o 1 , o 2 , … , o t O = o_1, o_2, \ldots, o_t O=o1,o2,,ot

公式
  1. 初始化
    α 1 ( i ) = P ( S i ) ⋅ P ( o 1 ∣ S i ) \alpha_1(i) = P(S_i) \cdot P(o_1 | S_i) α1(i)=P(Si)P(o1Si)
    其中, P ( S i ) P(S_i) P(Si) 是初始状态概率, P ( o 1 ∣ S i ) P(o_1 | S_i) P(o1Si) 是在状态 S i S_i Si 下生成观测 o 1 o_1 o1 的概率。

  2. 递归
    α t ( j ) = ∑ i = 1 N α t − 1 ( i ) ⋅ P ( S i → S j ) ⋅ P ( o t ∣ S j ) \alpha_t(j) = \sum_{i=1}^{N} \alpha_{t-1}(i) \cdot P(S_i \to S_j) \cdot P(o_t | S_j) αt(j)=i=1Nαt1(i)P(SiSj)P(otSj)
    其中, N N N 是状态的总数, P ( S i → S j ) P(S_i \to S_j) P(SiSj) 是从状态 S i S_i Si 转移到状态 S j S_j Sj 的概率, P ( o t ∣ S j ) P(o_t | S_j) P(otSj) 是在状态 S j S_j Sj 下生成观测 o t o_t ot 的概率。

  3. 归纳
    整个观测序列的概率为:
    P ( O ) = ∑ i = 1 N α T ( i ) P(O) = \sum_{i=1}^{N} \alpha_T(i) P(O)=i=1NαT(i)
    其中, T T T 是观测序列的长度。

示例

假设我们有一个简单的隐马尔可夫模型,用于天气预测。我们定义以下内容:

  • 状态集 S = { S 1 , S 2 } S = \{S_1, S_2\} S={S1,S2},其中 S 1 S_1 S1 表示“晴天”, S 2 S_2 S2 表示“雨天”。

  • 观测集 O = { o 1 , o 2 } O = \{o_1, o_2\} O={o1,o2},其中 o 1 o_1 o1 表示“走路”, o 2 o_2 o2 表示“看电影”。

  • 初始状态概率

    • P ( S 1 ) = 0.6 P(S_1) = 0.6 P(S1)=0.6(晴天的初始概率)
    • P ( S 2 ) = 0.4 P(S_2) = 0.4 P(S2)=0.4(雨天的初始概率)
  • 状态转移概率

    • P ( S 1 → S 1 ) = 0.7 P(S_1 \to S_1) = 0.7 P(S1S1)=0.7
    • P ( S 1 → S 2 ) = 0.3 P(S_1 \to S_2) = 0.3 P(S1S2)=0.3
    • P ( S 2 → S 1 ) = 0.4 P(S_2 \to S_1) = 0.4 P(S2S1)=0.4
    • P ( S 2 → S 2 ) = 0.6 P(S_2 \to S_2) = 0.6 P(S2S2)=0.6
  • 观测概率

    • P ( o 1 ∣ S 1 ) = 0.8 P(o_1 | S_1) = 0.8 P(o1S1)=0.8
    • P ( o 1 ∣ S 2 ) = 0.1 P(o_1 | S_2) = 0.1 P(o1S2)=0.1
    • P ( o 2 ∣ S 1 ) = 0.1 P(o_2 | S_1) = 0.1 P(o2S1)=0.1
    • P ( o 2 ∣ S 2 ) = 0.9 P(o_2 | S_2) = 0.9 P(o2S2)=0.9

我们要计算观测序列 O = [ o 1 , o 2 ] O = [o_1, o_2] O=[o1,o2] 的前向概率。

计算推导过程

  1. 初始化

    • 计算 t = 1 t=1 t=1 时的前向概率:
      α 1 ( S 1 ) = P ( S 1 ) ⋅ P ( o 1 ∣ S 1 ) = 0.6 ⋅ 0.8 = 0.48 \alpha_1(S_1) = P(S_1) \cdot P(o_1 | S_1) = 0.6 \cdot 0.8 = 0.48 α1(S1)=P(S1)P(o1S1)=0.60.8=0.48
      α 1 ( S 2 ) = P ( S 2 ) ⋅ P ( o 1 ∣ S 2 ) = 0.4 ⋅ 0.1 = 0.04 \alpha_1(S_2) = P(S_2) \cdot P(o_1 | S_2) = 0.4 \cdot 0.1 = 0.04 α1(S2)=P(S2)P(o1S2)=0.40.1=0.04
  2. 递归计算 t = 2 t=2 t=2):

    • 对于 S 1 S_1 S1
      α 2 ( S 1 ) = ∑ i = 1 2 α 1 ( S i ) ⋅ P ( S i → S 1 ) ⋅ P ( o 2 ∣ S 1 ) \alpha_2(S_1) = \sum_{i=1}^{2} \alpha_1(S_i) \cdot P(S_i \to S_1) \cdot P(o_2 | S_1) α2(S1)=i=12α1(Si)P(SiS1)P(o2S1)
      = α 1 ( S 1 ) ⋅ P ( S 1 → S 1 ) ⋅ P ( o 2 ∣ S 1 ) + α 1 ( S 2 ) ⋅ P ( S 2 → S 1 ) ⋅ P ( o 2 ∣ S 1 ) = \alpha_1(S_1) \cdot P(S_1 \to S_1) \cdot P(o_2 | S_1) + \alpha_1(S_2) \cdot P(S_2 \to S_1) \cdot P(o_2 | S_1) =α1(S1)P(S1S1)P(o2S1)+α1(S2)P(S2S1)P(o2S1)
      = 0.48 ⋅ 0.7 ⋅ 0.1 + 0.04 ⋅ 0.4 ⋅ 0.1 = 0.48 \cdot 0.7 \cdot 0.1 + 0.04 \cdot 0.4 \cdot 0.1 =0.480.70.1+0.040.40.1
      = 0.0336 + 0.0016 = 0.0352 = 0.0336 + 0.0016 = 0.0352 =0.0336+0.0016=0.0352

    • 对于 S 2 S_2 S2
      α 2 ( S 2 ) = ∑ i = 1 2 α 1 ( S i ) ⋅ P ( S i → S 2 ) ⋅ P ( o 2 ∣ S 2 ) \alpha_2(S_2) = \sum_{i=1}^{2} \alpha_1(S_i) \cdot P(S_i \to S_2) \cdot P(o_2 | S_2) α2(S2)=i=12α1(Si)P(SiS2)P(o2S2)
      = α 1 ( S 1 ) ⋅ P ( S 1 → S 2 ) ⋅ P ( o 2 ∣ S 2 ) + α 1 ( S 2 ) ⋅ P ( S 2 → S 2 ) ⋅ P ( o 2 ∣ S 2 ) = \alpha_1(S_1) \cdot P(S_1 \to S_2) \cdot P(o_2 | S_2) + \alpha_1(S_2) \cdot P(S_2 \to S_2) \cdot P(o_2 | S_2) =α1(S1)P(S1S2)P(o2S2)+α1(S2)P(S2S2)P(o2S2)
      = 0.48 ⋅ 0.3 ⋅ 0.1 + 0.04 ⋅ 0.6 ⋅ 0.9 = 0.48 \cdot 0.3 \cdot 0.1 + 0.04 \cdot 0.6 \cdot 0.9 =0.480.30.1+0.040.60.9
      = 0.0144 + 0.0216 = 0.036 = 0.0144 + 0.0216 = 0.036 =0.0144+0.0216=0.036

  3. 汇总前向概率
    P ( O ) = α 2 ( S 1 ) + α 2 ( S 2 ) = 0.0352 + 0.036 = 0.0712 P(O) = \alpha_2(S_1) + \alpha_2(S_2) = 0.0352 + 0.036 = 0.0712 P(O)=α2(S1)+α2(S2)=0.0352+0.036=0.0712

二、隐马尔可夫模型的解码问题

隐马尔可夫模型的解码问题是指在给定观测序列的情况下,寻找最可能的状态序列。通常使用维特比算法(Viterbi Algorithm)来解决。

维特比算法的原理

维特比算法的核心在于动态规划,通过递归关系计算每个状态的最大概率,并在最后回溯找到最优路径。

公式
  1. 初始化
    δ 1 ( i ) = P ( S i ) ⋅ P ( o 1 ∣ S i ) \delta_1(i) = P(S_i) \cdot P(o_1 | S_i) δ1(i)=P(Si)P(o1Si)
    其中, δ t ( i ) \delta_t(i) δt(i) 表示在时刻 t t t 处于状态 S i S_i Si 的最大概率。

  2. 递归计算
    δ t ( j ) = max ⁡ i ( δ t − 1 ( i ) ⋅ P ( S i → S j ) ) ⋅ P ( o t ∣ S j ) \delta_t(j) = \max_{i} \left( \delta_{t-1}(i) \cdot P(S_i \to S_j) \right) \cdot P(o_t | S_j) δt(j)=imax(δt1(i)P(SiSj))P(otSj)

  3. 终止
    找到最大概率并回溯状态序列:
    P ∗ = max ⁡ i δ T ( i ) P^* = \max_{i} \delta_T(i) P=imaxδT(i)

示例

继续使用上面的天气预测模型,假设我们观察到的序列是 O = [ o 1 , o 2 ] O = [o_1, o_2] O=[o1,o2](走路,看电影)。我们希望找到最可能的状态序列。

计算推导过程

  1. 初始化

    • 计算 t = 1 t=1 t=1 时的最大概率:
      δ 1 ( S 1 ) = P ( S 1 ) ⋅ P ( o 1 ∣ S 1 ) = 0.6 ⋅ 0.8 = 0.48 \delta_1(S_1) = P(S_1) \cdot P(o_1 | S_1) = 0.6 \cdot 0.8 = 0.48 δ1(S1)=P(S1)P(o1S1)=0.60.8=0.48
      δ 1 ( S 2 ) = P ( S 2 ) ⋅ P ( o 1 ∣ S 2 ) = 0.4 ⋅ 0.1 = 0.04 \delta_1(S_2) = P(S_2) \cdot P(o_1 | S_2) = 0.4 \cdot 0.1 = 0.04 δ1(S2)=P(S2)P(o1S2)=0.40.1=0.04
  2. 递归计算 t = 2 t=2 t=2):

    • 对于 S 1 S_1 S1
      δ 2 ( S 1 ) = max ⁡ i ( δ 1 ( S i ) ⋅ P ( S i → S 1 ) ) ⋅ P ( o 2 ∣ S 1 ) \delta_2(S_1) = \max_{i} \left( \delta_1(S_i) \cdot P(S_i \to S_1) \right) \cdot P(o_2 | S_1) δ2(S1)=imax(δ1(Si)P(SiS1))P(o2S1)
      = max ⁡ ( δ 1 ( S 1 ) ⋅ P ( S 1 → S 1 ) , δ 1 ( S 2 ) ⋅ P ( S 2 → S 1 ) ) ⋅ P ( o 2 ∣ S 1 ) = \max(\delta_1(S_1) \cdot P(S_1 \to S_1), \delta_1(S_2) \cdot P(S_2 \to S_1)) \cdot P(o_2 | S_1) =max(δ1(S1)P(S1S1),δ1(S2)P(S2S1))P(o2S1)
      = max ⁡ ( 0.48 ⋅ 0.7 , 0.04 ⋅ 0.4 ) ⋅ 0.1 = \max(0.48 \cdot 0.7, 0.04 \cdot 0.4) \cdot 0.1 =max(0.480.7,0.040.4)0.1
      = max ⁡ ( 0.336 , 0.016 ) ⋅ 0.1 = 0.0336 = \max(0.336, 0.016) \cdot 0.1 = 0.0336 =max(0.336,0.016)0.1=0.0336

    • 对于 S 2 S_2 S2
      δ 2 ( S 2 ) = max ⁡ i ( δ 1 ( S i ) ⋅ P ( S i → S 2 ) ) ⋅ P ( o 2 ∣ S 2 ) \delta_2(S_2) = \max_{i} \left( \delta_1(S_i) \cdot P(S_i \to S_2) \right) \cdot P(o_2 | S_2) δ2(S2)=imax(δ1(Si)P(SiS2))P(o2S2)
      = max ⁡ ( δ 1 ( S 1 ) ⋅ P ( S 1 → S 2 ) , δ 1 ( S 2 ) ⋅ P ( S 2 → S 2 ) ) ⋅ P ( o 2 ∣ S 2 ) = \max(\delta_1(S_1) \cdot P(S_1 \to S_2), \delta_1(S_2) \cdot P(S_2 \to S_2)) \cdot P(o_2 | S_2) =max(δ1(S1)P(S1S2),δ1(S2)P(S2S2))P(o2S2)
      = max ⁡ ( 0.48 ⋅ 0.3 , 0.04 ⋅ 0.6 ) ⋅ 0.9 = \max(0.48 \cdot 0.3, 0.04 \cdot 0.6) \cdot 0.9 =max(0.480.3,0.040.6)0.9
      = max ⁡ ( 0.144 , 0.024 ) ⋅ 0.9 = 0.1296 = \max(0.144, 0.024) \cdot 0.9 = 0.1296 =max(0.144,0.024)0.9=0.1296

  3. 终止

    • 计算最终的最大概率:
      P ∗ = max ⁡ ( δ 2 ( S 1 ) , δ 2 ( S 2 ) ) = max ⁡ ( 0.0336 , 0.1296 ) = 0.1296 P^* = \max(\delta_2(S_1), \delta_2(S_2)) = \max(0.0336, 0.1296) = 0.1296 P=max(δ2(S1),δ2(S2))=max(0.0336,0.1296)=0.1296
  4. 回溯

    • 通过记录路径,回溯找到最可能的状态序列。

Python代码实现

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns# 定义模型参数
states = ['Sunny', 'Rainy']
observations = ['Walk', 'Shop']
initial_prob = np.array([0.6, 0.4])
transition_prob = np.array([[0.7, 0.3],[0.4, 0.6]])
emission_prob = np.array([[0.8, 0.1],[0.1, 0.9]])# 前向算法
def forward_algorithm(observations):n_states = len(states)n_observations = len(observations)# 初始化前向概率矩阵alpha = np.zeros((n_states, n_observations))# 初始化alpha[:, 0] = initial_prob * emission_prob[:, observations[0]]# 递归计算for t in range(1, n_observations):for j in range(n_states):alpha[j, t] = np.sum(alpha[:, t - 1] * transition_prob[:, j]) * emission_prob[j, observations[t]]return alpha# 维特比算法
def viterbi_algorithm(observations):n_states = len(states)n_observations = len(observations)# 初始化维特比矩阵和路径delta = np.zeros((n_states, n_observations))path = np.zeros((n_states, n_observations), dtype=int)# 初始化delta[:, 0] = initial_prob * emission_prob[:, observations[0]]# 递归计算for t in range(1, n_observations):for j in range(n_states):max_prob = -1max_state = -1for i in range(n_states):prob = delta[i, t - 1] * transition_prob[i, j]if prob > max_prob:max_prob = probmax_state = idelta[j, t] = max_prob * emission_prob[j, observations[t]]path[j, t] = max_state# 终止max_final_prob = np.max(delta[:, -1])best_last_state = np.argmax(delta[:, -1])# 回溯best_path = [best_last_state]for t in range(n_observations - 1, 0, -1):best_last_state = path[best_last_state, t]best_path.insert(0, best_last_state)return best_path, max_final_prob# 观测序列
obs_sequence = [0, 1]  # Walk, Shop# 计算前向概率
alpha = forward_algorithm(obs_sequence)# 可视化前向概率矩阵
plt.figure(figsize=(10, 6))
sns.heatmap(alpha, annot=True, fmt=".2f", cmap="YlGnBu", xticklabels=observations, yticklabels=states)
plt.title("Forward Probability Matrix")
plt.xlabel("Observations")
plt.ylabel("States")
plt.show()# 计算维特比算法
best_path, max_prob = viterbi_algorithm(obs_sequence)# 可视化维特比算法的结果
plt.figure(figsize=(8, 4))
plt.bar(states, [np.max(alpha[:, -1]) if i in best_path else 0 for i in range(len(states))],color=['blue' if i in best_path else 'gray' for i in range(len(states))])
plt.title("Viterbi Algorithm Result")
plt.xlabel("States")
plt.ylabel("Probability")
plt.xticks(ticks=np.arange(len(states)), labels=states)
plt.show()print("最可能的状态序列:", [states[i] for i in best_path])
print("最大概率:", max_prob)

三、在语音模型中的应用

隐马尔可夫模型在语音处理领域,尤其是在降噪模型中,具有重要的应用。降噪模型旨在从嘈杂的音频信号中恢复清晰的语音信号。HMM 可以用于建模语音信号的时序特性,帮助识别和分离语音与噪声。

应用示例

  1. 语音识别:HMM 可以用于建模语音信号的不同状态(如发音的不同阶段),并通过前向算法计算观测序列的概率,从而识别语音内容。
  2. 降噪处理:在降噪模型中,HMM 可以用于建模干净语音和噪声的状态,通过解码问题找到最可能的干净语音状态序列,从而去除背景噪声。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/478752.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vxe-modal VxeUI 窗口组件弹窗多窗口模式

VxeUI 实现在 vue 中使用弹窗组件,弹窗多个窗口可叠加,实现多实例的窗口组件。 npm install vxe-pc-ui4.3.6// ...import VxeUI from vxe-pc-uiimport vxe-pc-ui/lib/style.css// ...createApp(App).use(VxeUI).mount(#app)// ...官网:https…

无人机探测:光电侦测核心技术算法详解!

核心技术 双光谱探测跟踪: 可见光成像技术:利用无人机表面反射的自然光或主动光源照射下的反射光,通过高灵敏度相机捕捉图像。该技术适用于日间晴朗天气下的无人机探测,具有直观、易于识别目标的特点。 红外成像技术&#xff1…

【ArcGISPro】Sentinel-2数据处理

错误 默认拉进去只组织了4个波段,但是实际有12个波段 解决方案 数据下载 Sentinel-2 数据下载-CSDN博客 数据处理 数据查看 创建镶嵌数据集 在数据管理工具箱中找到创建镶嵌数据集

现代密码学

概论 计算机安全的最核心三个关键目标(指标)/为:保密性 Confidentiality、完整性 Integrity、可用性 Availability ,三者称为 CIA三元组 数据保密性:确保隐私或是秘密信息不向非授权者泄漏,也不被非授权者使…

Python绘制太极八卦

文章目录 系列目录写在前面技术需求1. 图形绘制库的支持2. 图形绘制功能3. 参数化设计4. 绘制控制5. 数据处理6. 用户界面 完整代码代码分析1. rset() 函数2. offset() 函数3. taiji() 函数4. bagua() 函数5. 绘制过程6. 技术亮点 写在后面 系列目录 序号直达链接爱心系列1Pyth…

uniapp vue2项目迁移vue3项目

uniapp vue2项目迁移vue3项目,必须适配的部分 一、main.js 创建应用实例 // 之前 - Vue 2 import Vue from vue import App from ./App Vue.config.productionTip false // vue3 不再需要 App.mpType app // vue3 不再需要 const app new Vue({ ...App }) …

卷积神经网络学习记录

目录 神经网络基础定义: 基本组成部分 工作流程 卷积层(卷积定义)【CONV】: 卷积层(Convolutional Layer) 特征提取:卷积层的主要作用是通过卷积核(或滤波器)运算提…

element-ui 中el-calendar 日历插件获取显示的第一天和最后一天【原创】

需要获取el-calendar 日历组件上的第1天和最后一天。可以通过document.querySelector()方法进行获取dom元素中的值,这样避免计算问题。 获取的过程中主要有两个难点,第1个是处理上1月和下1月的数据,第2个是跨年的数据。 直接贴代码&#xff…

一个高度可扩展的 Golang ORM 库【GORM】

GORM 是一个功能强大的 Golang 对象关系映射(ORM)库,它提供了简洁的接口和全面的功能,帮助开发者更方便地操作数据库。 1. 完整的 ORM 功能 • 支持常见的关系模型: • Has One(一对一) • …

【大数据学习 | Spark-Core】Spark的改变分区的算子

当分区由多变少时,不需要shuffle,也就是父RDD与子RDD之间是窄依赖。 当分区由少变多时,是需要shuffle的。 但极端情况下(1000个分区变成1个分区),这时如果将shuffle设置为false,父子RDD是窄依赖关系&…

IDEA2024如何创建Web项目以及配置Tomcat

在Web项目的开发过程中,Tomcat作为一款开源的Servlet容器,扮演着至关重要的角色。它不仅能够提供稳定的运行环境,还支持多种Java EE规范,为开发者提供了丰富的功能支持。因此,正确配置Tomcat服务器对于确保Web项目的顺…

【通俗理解】隐变量的变分分布探索——从公式到应用

【通俗理解】隐变量的变分分布探索——从公式到应用 关键词提炼 #隐变量 #变分分布 #概率模型 #公式推导 #期望最大化 #机器学习 #变分贝叶斯 #隐马尔可夫模型 第一节:隐变量的变分分布的类比与核心概念【尽可能通俗】 隐变量的变分分布就像是一场“捉迷藏”游戏…

亚信安全与飞书达成深度合作

近日,亚信安全联合飞书举办的“走近先进”系列活动正式走进亚信。活动以“安全护航信息化 共筑数字未来路”为主题,吸引了众多数字化转型前沿企业的近百位领导参会。作为“走近先进”系列的第二场活动,本场活动更加深入挖掘了数字化转型的基础…

【Vue】 npm install amap-js-api-loader指南

前言 项目中的地图模块突然打不开了 正文 版本太低了,而且Vue项目就应该正经走项目流程啊喂! npm i amap/amap-jsapi-loader --save 官方说这样执行完,就这结束啦!它结束了,我还没有,不然不可能记录这篇文…

使用ENSP实现默认路由

一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为2.2.2.1/24 ip address 2.2.2.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为1.…

Ansible--自动化运维工具

Ansible自动化运维工具介绍 1.Ansible介绍 Ansible是一款自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。…

WSL安装不同版本ubuntu(已有ubuntu20.04,再装ubuntu18.04)

参考: 如何在 WSL 中删除指定版本的 Ubuntu(以删除 Ubuntu 22.04 为例)_wsl卸载某个-CSDN博客 已有ubuntu20.04,现在再安装一个ubuntu18.04 直接参考下面我写的链接的第四步,前面的步骤都不需要再做了 Win11安装WSL…

深度学习:GPT-1的MindSpore实践

GPT-1简介 GPT-1(Generative Pre-trained Transformer)是2018年由Open AI提出的一个结合预训练和微调的用于解决文本理解和文本生成任务的模型。它的基础是Transformer架构,具有如下创新点: NLP领域的迁移学习:通过最…

websocket是什么?

一、定义 Websocket是一种在单个TCP连接上进行全双工通信的协议,它允许服务器主动向客户端推送数据,而不需要客户端不断的轮询服务器来获取数据 与http协议不同,http是一种无状态的,请求,响应模式的协议(单向通信)&a…

1-golang_org_x_crypto_bcrypt测试 --go开源库测试

1.实例测试 package mainimport ("fmt""golang.org/x/crypto/bcrypt" )func main() {password : []byte("mysecretpassword")hashedPassword, err : bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)if err ! nil {fmt.Println(err)…