Bayes分类器设计

第1关:统计判决贝叶斯理论

x = [-3.9847 -3.5549 -1.2401 -0.9780 -0.7932 -2.8531 
    -2.7605 -3.7287 -3.5414 -2.2692 -3.4549 -3.0752 
    -3.9934 2.8792 -0.9780 0.7932 1.1882 3.0682 
    -1.5799 -1.4885 0.7431 -0.4221 -1.1186 4.2532];
pw = [0.9 0.1];

%% 类条件概率分布正态分布分别为N(e1,a1)N(e2,a2)
e1 = -2; a1 = 0.5;
e2 = 2; a2 = 2;
m = numel(x);
result = zeros(1,m);

%%%%%%%%%% Begin %%%%%%%%%%

%% 计算后验概率 
for i = 1:m
    pw1_x(i) = (pw(1) * normpdf(x(i),e1,a1)) / (pw(1) * normpdf(x(i),e1,a1) + pw(2) * normpdf(x(i),e2,a2));
    pw2_x(i) = (pw(2) * normpdf(x(i),e2,a2)) / (pw(1) * normpdf(x(i),e1,a1) + pw(2) * normpdf(x(i),e2,a2));
end

%% 根据最小误判概率准则进行判决,结果存入result中
for i = 1:m
    if pw1_x(i) > pw2_x(i)
        result(i) = 0;
    else
        result(i) = 1;
    end
end

%%%%%%%%%% End %%%%%%%%%%

fprintf("%4d",result);
fprintf("\n");

第2关:正态分布模式的贝叶斯判别函数

pkg load statistics
function GuassianBayesModel(w, p, X)
%%%%%%%%%% Begin %%%%%%%%%%
%%根据给出的样本数据,求各个类的均值
u(:,:,1) = sum(w(:,:,1)) ./ 10;
u(:,:,2) = sum(w(:,:,2)) ./ 10;
u(:,:,3) = sum(w(:,:,3)) ./ 10;
%%求各个类的协方差矩阵
sigma(:,:,1) = cov(w(:,:,1));
sigma(:,:,2) = cov(w(:,:,2));
sigma(:,:,3) = cov(w(:,:,3));
%%构建判别函数,计算点到每个类的马氏距离以及欧氏距离
for i = 1:3;
    P(i) = mvnpdf(X,u(:,:,i),sigma(:,:,i))*p(i);
    md(i) = sqrt((X-u(:,:,i))*inv(sigma(:,:,i))*(X-u(:,:,i))');
    ed(i) = sqrt(sum((X-u(:,:,i)).^2));
end
%%%%%%%%%% End %%%%%%%%%%
%判断样本属于哪个类的概率最高,并显示点到每个类的马氏距离和欧氏距离
maxP = max(P);
result = find(P==maxP);
fprintf("点[%s]关于第1、2、3类的判别函数值分别为:%s %s %s\n",num2str(X),num2str(P(1)),num2str(P(2)),num2str(P(3)));
fprintf("点[%s]到第1、2、3类的马氏距离为:%s %s %s\n",num2str(X),num2str(md(1)),num2str(md(2)),num2str(md(3)));
fprintf("点[%s]到第1、2、3类的欧氏距离为:%s %s %s\n",num2str(X),num2str(ed(1)),num2str(ed(2)),num2str(ed(3)));
fprintf("点[%s]属于第%s类\n",num2str(X),num2str(result));
end
% w1,w2,w3三类散点
w = zeros(10,3,3);
w(:,:,1) = [-5.01 -8.12 -3.68;...
            -5.43 -3.48 -3.54;...
             1.08 -5.52  1.66;...
             0.86 -3.78 -4.11;...
            -2.67  0.63  7.39;...
             4.94  3.29  2.08;...
            -2.51  2.09 -2.59;...
            -2.25 -2.13 -6.94;...
             5.56  2.86 -2.26;...
             1.03 -3.33  4.33];
w(:,:,2) = [-0.91 -0.18 -0.05;...
             1.30 -.206 -3.53;...
            -7.75 -4.54 -0.95;...
            -5.47  0.50  3.92;...
             6.14  5.72 -4.85;...
             3.60  1.26  4.36;...
             5.37 -4.63 -3.65;...
             7.18  1.46 -6.66;...
            -7.39  1.17  6.30;...
            -7.50 -6.32 -0.31];
w(:,:,3) = [ 5.35  2.26  8.13;...
             5.12  3.22 -2.66;...
            -1.34 -5.31 -9.87;...
             4.48  3.42  5.19;...
             7.11  2.39  9.21;...
             7.17  4.33 -0.98;...
             5.75  3.97  6.65;...
             0.77  0.27  2.41;...
             0.90 -0.43 -8.71;...
             3.52 -0.36  6.43];
%设置各类别先验概率
pw = [1/3 1/3 1/3];
%样本矢量
X1 = [1 2 1];
X2 = [5 3 2];
X3 = [0 0 0];
% 调用高斯型Bayes判别函数,输出判别函数值、马氏距离和判别结果
GuassianBayesModel(w,pw,X1);
GuassianBayesModel(w,pw,X2);
GuassianBayesModel(w,pw,X3);
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的朴素贝叶斯分类的Python代码示例,用于对垃圾邮件进行分类: ```python import numpy as np class NaiveBayes: def __init__(self): self.prior = {} # 先验概率 self.conditional = {} # 条件概率 self.classes = [] # 所有可能的分类 def fit(self, X, y): n_samples, n_features = X.shape self.classes = np.unique(y) n_classes = len(self.classes) # 计算先验概率 for c in self.classes: self.prior[c] = np.sum(y == c) / n_samples # 计算条件概率 for c in self.classes: X_c = X[y == c] self.conditional[c] = {} for i in range(n_features): self.conditional[c][i] = {} for value in np.unique(X[:, i]): self.conditional[c][i][value] = np.sum(X_c[:, i] == value) / len(X_c) def predict(self, X): y_pred = [] for x in X: posterior = {} for c in self.classes: # 计算后验概率 likelihood = 1 for i, value in enumerate(x): likelihood *= self.conditional[c][i][value] posterior[c] = self.prior[c] * likelihood # 选择后验概率最大的分类作为预测结果 y_pred.append(max(posterior, key=posterior.get)) return y_pred ``` 使用示例: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.preprocessing import LabelEncoder data = load_iris() X = data['data'] y = data['target'] le = LabelEncoder() y = le.fit_transform(y) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) nb = NaiveBayes() nb.fit(X_train, y_train) y_pred = nb.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print(accuracy) ``` 请注意,此代码示例仅用于演示目的,可能不适用于所有数据集和情况。需要根据实际情况进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值