• 统计学习方法 | 朴素贝叶斯法


    目录

    一、朴素贝叶斯法的原理 

    二、极大似然估计下的朴素贝叶斯算法python实现 

    三、贝叶斯估计下的朴素贝叶斯算法python实现


    一、朴素贝叶斯法的原理 

    791b89a7e8454ba8a7e2668d41d63a52.jpeg

    1bdd4355dc304a5dae806e7dfe8adab9.jpeg 49112929f83b4c00b9140cf726affa5a.jpeg

    二、极大似然估计下的朴素贝叶斯算法python实现 

    1. import numpy as np
    2. def naiveBayes(X,Y,n,x):
    3. '''X代表的是各个特征的特征值
    4. Y代表类标记
    5. n代表特征类别
    6. x代表需要预测的数据点'''
    7. '''得到各特征和类标记的类别'''
    8. # 各特征X的类别
    9. xfeature = []
    10. for i in X:
    11. xfeature.append(np.unique(i))
    12. # 类标记Y的类别
    13. yfeature = np.unique(Y)
    14. '''计算各特征和类标记所对应的类别数'''
    15. # 各特征X的类别数
    16. xfeaturenum = []
    17. for i in xfeature:
    18. xfeaturenum.append(len(i))
    19. # 类标记的类别数
    20. yfeaturenum = len(yfeature)
    21. '''计算各个类标记所占的比例'''
    22. N = len(Y) # 训练数据的总量
    23. PY = [] # 存储各个类标记Y所占的比例
    24. for i in yfeature:
    25. a = 0 # 计数器
    26. for j in Y:
    27. if j == i:
    28. a += 1
    29. PY.append(round(a / N, 6)) # 最多保留6位小数
    30. '''计算各个类标记Y下取得不同特征值X的比例'''
    31. PYX = []
    32. for i in range(yfeaturenum):
    33. P = [] # 存储在不同类标记下各个特征的比例
    34. py = PY[i] # 对应类标记的概率
    35. for j in range(n):
    36. Q = [] # 存储在某个类标记下某个特征取不同特征值对应的比例
    37. for k in xfeature[j]: # 取X的特征
    38. b = 0 # 计数器
    39. for h in range(N):
    40. if Y[h] == yfeature[i] and X[j][h] == k:
    41. b += 1
    42. Q.append(round((b / N) / py, 6)) # 最多保留6位小数
    43. P.append(Q)
    44. PYX.append(P)
    45. '''显示训练结果'''
    46. print("----------先验概率----------")
    47. for i in range(yfeaturenum):
    48. print("P(Y={})={}".format(yfeature[i], PY[i]), end=" ")
    49. print("\n")
    50. for i in range(yfeaturenum):
    51. for j in range(n):
    52. v = xfeaturenum[j]
    53. for k in range(v):
    54. print("P(X={}|Y={})={}".format(xfeature[j][k], yfeature[i], PYX[i][j][k]), end=" ")
    55. print("\n")
    56. '''对所给数据利用贝叶斯分类器进行预测'''
    57. '''计算所给数据在各个可能的类别下的后验概率'''
    58. R = [] # 存储数据在各个可能的类别下的后验概率
    59. # 返回各个特征相对应的索引
    60. index = []
    61. for i in range(n):
    62. index.append((xfeature[i].tolist()).index(x[i]))
    63. # 计算相应的后验概率
    64. for i in range(n):
    65. r = PY[i]
    66. for j in range(n):
    67. r = r * PYX[i][j][index[j]]
    68. R.append(round(r, 6)) # 最多保留6位小数
    69. '''输出后验概率'''
    70. print("----------后验概率----------")
    71. for i in range(n):
    72. print("P(Y={})P(X1={}|Y={})P(X2={}|Y={})={}".format(yfeature[i], xfeature[0][index[0]],
    73. yfeature[i], xfeature[1][index[1]], yfeature[i], R[i],
    74. end=" "))
    75. print("\n")
    76. '''输出利用贝叶斯分类器预测得到的结果'''
    77. maxindex = R.index(max(R))
    78. w = yfeature[maxindex]
    79. print("----------预测结果----------")
    80. print("数据点{}对应的类别是:{}".format(x, w))
    81. if __name__=="__main__":
    82. '''训练数据'''
    83. X1 = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3] # 特征1
    84. X2 = ['S', 'M', 'M', 'S', 'S', 'S', 'M', 'M', 'L', 'L', 'L', 'M', 'M', 'L', 'L'] # 特征2
    85. X = [X1, X2]
    86. n = 2 # 特征量
    87. Y = [-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1] # 分类结果
    88. '''给定数据点利用贝叶斯分类器进行预测'''
    89. x = [2, 'S']
    90. '''调用朴素贝叶斯分类器'''
    91. naiveBayes(X,Y,n,x)

     fa87f1adacd94b42ac1a3006fc88b4a4.png

    三、贝叶斯估计下的朴素贝叶斯算法python实现

    1. import numpy as np
    2. def naiveBayes(X,Y,n,x):
    3. '''X代表的是各个特征的特征值
    4. Y代表类标记
    5. n代表特征类别
    6. x代表需要预测的数据点'''
    7. '''得到各特征和类标记的类别'''
    8. # 各特征X的类别
    9. xfeature = []
    10. for i in X:
    11. xfeature.append(np.unique(i))
    12. # 类标记Y的类别
    13. yfeature = np.unique(Y)
    14. '''计算各特征和类标记所对应的类别数'''
    15. # 各特征X的类别数
    16. xfeaturenum = []
    17. for i in xfeature:
    18. xfeaturenum.append(len(i))
    19. # 类标记的类别数
    20. yfeaturenum = len(yfeature)
    21. '''定义贝叶斯估计中z的值,,这里取1,即采用拉普拉斯光滑'''
    22. z=1
    23. '''计算各个类标记所占的比例'''
    24. N = len(Y) # 训练数据的总量
    25. ynum=[] #存储各个类标记的数量
    26. PY = [] # 存储各个类标记Y所占的比例
    27. for i in yfeature:
    28. a = 0 # 计数器
    29. for j in Y:
    30. if j == i:
    31. a += 1
    32. ynum.append(a)
    33. PY.append(round((a+z) / (N+z*yfeaturenum), 6)) # 最多保留6位小数
    34. '''计算各个类标记Y下取得不同特征值X的比例'''
    35. PYX = []
    36. for i in range(yfeaturenum):
    37. P = [] # 存储在不同类标记下各个特征的比例
    38. py = PY[i] # 对应类标记的概率
    39. for j in range(n):
    40. Q = [] # 存储在某个类标记下某个特征取不同特征值对应的比例
    41. for k in xfeature[j]: # 取X的特征
    42. b = 0 # 计数器
    43. for h in range(N):
    44. if Y[h] == yfeature[i] and X[j][h] == k:
    45. b += 1
    46. Q.append(round((b+z)/(ynum[i]+z*xfeaturenum[j]), 6)) # 最多保留6位小数
    47. P.append(Q)
    48. PYX.append(P)
    49. '''显示训练结果'''
    50. print("----------先验概率----------")
    51. for i in range(yfeaturenum):
    52. print("P(Y={})={}".format(yfeature[i], PY[i]), end=" ")
    53. print("\n")
    54. for i in range(yfeaturenum):
    55. for j in range(n):
    56. v = xfeaturenum[j]
    57. for k in range(v):
    58. print("P(X={}|Y={})={}".format(xfeature[j][k], yfeature[i], PYX[i][j][k]), end=" ")
    59. print("\n")
    60. '''对所给数据利用贝叶斯分类器进行预测'''
    61. '''计算所给数据在各个可能的类别下的后验概率'''
    62. R = [] # 存储数据在各个可能的类别下的后验概率
    63. # 返回各个特征相对应的索引
    64. index = []
    65. for i in range(n):
    66. index.append((xfeature[i].tolist()).index(x[i]))
    67. # 计算相应的后验概率
    68. for i in range(n):
    69. r = PY[i]
    70. for j in range(n):
    71. r = r * PYX[i][j][index[j]]
    72. R.append(round(r, 6)) # 最多保留6位小数
    73. '''输出后验概率'''
    74. print("----------后验概率----------")
    75. for i in range(n):
    76. print("P(Y={})P(X1={}|Y={})P(X2={}|Y={})={}".format(yfeature[i], xfeature[0][index[0]],
    77. yfeature[i], xfeature[1][index[1]], yfeature[i], R[i],
    78. end=" "))
    79. print("\n")
    80. '''输出利用贝叶斯分类器预测得到的结果'''
    81. maxindex = R.index(max(R))
    82. w = yfeature[maxindex]
    83. print("----------预测结果----------")
    84. print("数据点{}对应的类别是:{}".format(x, w))
    85. if __name__=="__main__":
    86. '''训练数据'''
    87. X1 = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3] # 特征1
    88. X2 = ['S', 'M', 'M', 'S', 'S', 'S', 'M', 'M', 'L', 'L', 'L', 'M', 'M', 'L', 'L'] # 特征2
    89. X = [X1, X2]
    90. n = 2 # 特征量
    91. Y = [-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1] # 分类结果
    92. '''给定数据点利用贝叶斯分类器进行预测'''
    93. x = [2, 'S']
    94. '''调用朴素贝叶斯分类器'''
    95. naiveBayes(X,Y,n,x)

    8977c865d9f64e8aacb7e7e076af9c31.png

     

  • 相关阅读:
    【AI视野·今日Sound 声学论文速览 第六期】Mon, 18 Sep 2023
    ReentrantReadWriteLock 读写锁的使⽤
    CSS结构选择器的使用
    C++初阶(vector容器+模拟实现)
    基于Springboot的宠物医院管理系统-JAVA【数据库设计、论文、源码、开题报告】
    iOS - 多线程-读写安全
    gitlub 加载慢问题处理
    2024前端面试每日一更——简述MVVM?
    小鼠血清白蛋白包裹四氧化三铁纳米粒
    BitSet源码解析,位运算玩的真六
  • 原文地址:https://blog.csdn.net/m0_70452407/article/details/132896013