当前位置:   article > 正文

【数据建模】常用算法模型(python与matlab版本)详细代码解析_python智能算法建模

python智能算法建模

在这里插入图片描述
文末附上完整算法模板的获取方式

使用python从0实现拉普拉斯修正的朴素贝叶斯分类器

问题理解与分析

在这里插入图片描述

算法原理阐述

在这里插入图片描述
在这里插入图片描述

算法设计思路

在这里插入图片描述
在这里插入图片描述

实验流程分析

在这里插入图片描述

实验结果

在这里插入图片描述

核心代码分析

# 参考代码:https://aistudio.baidu.com/aistudio/projectdetail/2654369?forkThirdPart=1
class LpBayes:
    def __init__(self,isWeights=False):
        # 存储连续属性列
        self.continuousCols = []
        # 是否使用属性加权
        # self.isWeights = isWeights
        # 存储离散属性列
        self.discreteCols = []
        # 存储列名
        self.featureList = []
    def initFeats(self,featureList):
        self.featureList = featureList
    def getFeatClass(self,X):
        for j,value in enumerate(X[0]):
            if isinstance(value,float):
                self.continuousCols.append(j)
            else:
                self.discreteCols.append(j)
    def fit(self, X, y, featureList):
        # 初始化列名
        self.initFeats(featureList)
        # 初始化属性的数值类型
        self.getFeatClass(X)
        self.Xtrain = np.array(X)
        self.ytrain = np.array(y).reshape((-1, 1))
        # 将离散属性和连续属性划分开进行处理
        self.dis_X = X[:, self.discreteCols]
        self.con_X = X[:, self.continuousCols]
        # 计算类别集合
        self.classSet = np.unique(y)
        # 获取所有离散型属性的条件概率
        self.dis_P_all = self.Get_P_of_discrete()
        # 计算每个类别的先验概率
        self.P_c = ((self.classSet == self.ytrain).sum(axis=0) + 1) / (X.shape[0] + self.classSet.shape[0])
        # # 将连续值分箱并计算频率概率
        # if self.isWeights:
        #     self.CountVal()
    def Get_P_of_discrete(self):
        P_all = []
        # 遍历所有类别
        for i, c in enumerate(self.classSet):
            # 取出当前类别对应的样本
            X_of_class = self.Xtrain[(self.ytrain == c).ravel()]
            # 记录每一属性的每一个取值的条件概率
            an_temp_dict = {}
            # 遍历样本中的每一个属性
            for j in range(X_of_class.shape[1]):
                if j in self.discreteCols:
                    temp_dict = {}
                    # 获取当前属性的所有取值
                    temp_uni = np.unique(self.Xtrain[:, j])
                    for xvalue in temp_uni:
                        # 根据当前属性取值计算其条件概率
                        temp_dict[xvalue] = self.P(X_of_class, j, xvalue, temp_uni.shape[0])
                    an_temp_dict[self.featureList[j]] = temp_dict
                # 把当前类别的属性条件概率加入列表中
                P_all.insert(i, an_temp_dict)
        return P_all

    # 连续值属性的条件概率
    def Get_P_of_continuous(self, X, j, x_i):
        meanCol = X[:, j].mean()
        stdCol = X[:, j].std()
        return st.norm.pdf(x_i, loc=meanCol, scale=stdCol)
    # 计算离散型属性的条件概率
    def P(self, X, x, x_i, N):
        return ((X[:, x] == x_i).sum() + 1) / (X.shape[0] + N)
    def predict(self, X_pre):
        # 初始化每个待预测样本的标签
        y_pre = np.ones(X_pre.shape[0], dtype='object')
        # 遍历每一个待预测的样本
        for i, X in enumerate(X_pre):
            max = 0
            res_c = 0
            for k, c in enumerate(self.classSet):  # 枚举y的取值计算概率
                res = 1
                X_of_class = self.Xtrain[(self.ytrain == c).ravel()]  # 这是y等于c时的集合
                j = 0
                for x in range(X.shape[0]):
                    if x in self.continuousCols:# 连续值
                        res *= self.Get_P_of_continuous(X_of_class, x, X[x])
                    else:
                        res *= (self.dis_P_all[k][self.featureList[j]][X[x]])
                        j += 1
                res *= self.P_c[k]
                if res > max:  # 看看哪种情况可能性最大
                    max = res
                    res_c = c
            y_pre[i] = res_c
        return y_pre.reshape((-1,1))

    def predictDF(self,X_pre,featureList):
        predf = pd.concat([pd.DataFrame(X_pre, columns=featureList), pd.DataFrame(self.predict(X_pre), columns=['预测标签'])],axis=1)
        return predf

    def score(self,Xtest,ytest):
        ypre = self.predict(Xtest)
        # 计算准确率
        acc = (ypre.reshape(-1) == ytest).sum() / ytest.shape[0]
        # print('准确率为:',acc)
        return acc
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
'
运行

获取完整项目文件可以关注微信公众号:艺千秋录
输入:数学建模算法模板
即可获取完整的项目文件
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/887393
推荐阅读
相关标签
  

闽ICP备14008679号