贝叶斯分类器学习

        贝叶斯决策论是一种基于贝叶斯统计理论的决策方法,它在面对不确定性和风险时提供了一种理论上的优化决策框架。

先验概率:

在贝叶斯决策论中,我们首先需要对决策环境的不确定性进行建模。这通过先验概率来实现,即在任何观测数据之前,我们对不同可能状态或事件发生的概率的估计。

似然函数:

一旦有了先验概率,我们观测到数据后需要考虑如何更新我们对事件的信念。这通过似然函数来实现,似然函数描述了在给定某个假设下观察到数据的可能性。

后验概率:

贝叶斯公式描述了如何从先验概率和似然函数推导出后验概率。后验概率是在观测到数据之后,我们对事件发生的概率进行重新评估的结果。它提供了更加准确和更新的概率估计,帮助我们做出更明智的决策。

损失函数:

         决策问题的核心是通过损失函数来量化不同决策结果的损失或成本。这是决策最终评估标准的关键,因为我们希望选择的决策能够在期望损失方面最小化风险。

决策过程

观测数据:

假设我们面对一个决策,我们首先收集相关数据或信息。这些数据可以是实验结果、市场趋势、病人的检查结果等。

贝叶斯更新:

使用贝叶斯公式,我们将先验概率和似然函数结合,计算出观测数据之后的后验概率分布。这一步骤是将先前的信念与新的观测结果结合起来,形成更新后的信念。

决策规则:

选择一个决策规则来指导决策过程。这可能包括最小化期望损失、最大化期望效用、最大化后验概率等不同的标准。决策规则的选择取决于具体的决策环境和问题设定。

决策实施:

最终,根据选定的决策规则,确定最优的行动或策略。这个过程可以通过计算机算法或者手动决策来完成,具体取决于问题的复杂性和可用的资源。

极大似然估计(Maximum Likelihood Estimation, MLE)是一种常用的参数估计方法,特别适用于统计模型的参数估计。它的核心思想是利用观测数据来寻找能够使数据出现的概率最大化的参数值。

方法步骤:

定义似然函数:

首先,对于给定的统计模型,定义似然函数。似然函数是参数的函数,表示在给定参数下观测到样本的概率密度函数或概率质量函数。通常用 ( L(\theta; \mathbf{x}) ) 表示,其中 ( \theta ) 是待估计的参数, ( \mathbf{x} ) 是观测到的样本数据。

取对数似然函数:

为了简化计算和处理,通常取似然函数的对数,得到对数似然函数 ( \ell(\theta; \mathbf{x}) = \log L(\theta; \mathbf{x}) )。

建立似然方程:

将对数似然函数关于参数 ( \theta ) 求导数,并令导数等于零,得到似然方程 ( \frac{\partial \ell(\theta; \mathbf{x})}{\partial \theta} = 0 )。

求解似然方程:

解似然方程得到参数 ( \hat{\theta} ) 的估计值,即极大似然估计量。

示例:

假设我们有一个来自正态分布 ( N(\mu, \sigma^2) ) 的样本 ( \mathbf{x} = {x_1, x_2, \ldots, x_n} ),我们希望估计均值 ( \mu ) 和方差 ( \sigma^2 )。

定义似然函数:

正态分布的似然函数为: [ L(\mu, \sigma^2; \mathbf{x}) = \prod_{i=1}^{n} \frac{1}{\sqrt{2\pi\sigma^2}} \exp \left( -\frac{(x_i - \mu)^2}{2\sigma^2} \right) ]

取对数似然函数:

对数似然函数为: [ \ell(\mu, \sigma^2; \mathbf{x}) = -\frac{n}{2} \log(2\pi\sigma^2) - \frac{1}{2\sigma^2} \sum_{i=1}^{n} (x_i - \mu)^2 ]

求解似然方程:

对 ( \mu ) 和 ( \sigma^2 ) 分别求偏导数并令其等于零,得到: [ \hat{\mu}{\text{MLE}} = \frac{1}{n} \sum{i=1}^{n} x_i \quad \text{和} \quad \hat{\sigma}^2_{\text{MLE}} = \frac{1}{n} \sum_{i=1}^{n} (x_i - \hat{\mu}_{\text{MLE}})^2 ]

朴素贝叶斯分类器是一种基于贝叶斯定理和特征条件独立假设的简单且高效的分类算法。它在实际应用中常用于文本分类、垃圾邮件过滤、情感分析等任务。

数据准备

数据预处理:确保数据格式正确,处理缺失值、异常值等。

特征选择:选择合适的特征,朴素贝叶斯假设特征之间条件独立,因此特征选择的质量直接影响分类器的效果。

2. 训练模型

选择合适的朴素贝叶斯模型:通常有多种变体,如高斯朴素贝叶斯、多项式朴素贝叶斯和伯努利朴素贝叶斯,根据数据类型选择合适的模型。

使用训练数据:利用标记的训练数据集来训练模型。模型的训练包括计算类别的先验概率和每个特征在每个类别下的条件概率。

3. 模型评估

交叉验证:使用交叉验证技术评估模型的泛化能力。

评估指标:常见的评估指标包括准确率、精确率、召回率和 F1 分数。

4. 模型应用

预测:使用训练好的模型对新数据进行分类预测。

调优:根据评估结果对模型进行调优,可能需要调整特征选择、模型选择或参数调整。

实际操作中的注意事项:

处理稀疏数据:在文本分类等任务中,数据通常是高维稀疏的,需要考虑特征频率和平滑技术。

处理连续特征:对于连续特征,可以采用高斯朴素贝叶斯或者将其离散化。

处理类别不平衡:如何处理类别不平衡是一个重要问题,可以通过调整类别先验概率或使用更复杂的方法来解决。

贝叶斯网络(Bayesian Network)是一种概率图模型,用于表示随机变量之间的依赖关系。它的结构由两部分组成:图结构和参数。

1. 图结构

贝叶斯网络通过有向无环图(DAG)来表示变量之间的依赖关系,其中:

节点(Nodes):每个节点代表一个随机变量。

有向边(Directed Edges):有向边表示变量之间的因果关系或者依赖关系。

例如,如果节点 A 指向节点 B,则表示 B 的条件概率依赖于 A 的状态。

2. 参数

贝叶斯网络的参数包括每个节点的条件概率分布(Conditional Probability Distributions,CPDs)。每个节点的条件概率分布描述了给定其父节点状态时,节点自身状态的概率分布。

实现步骤:

a. 确定网络结构

确定随机变量:确定问题中涉及的随机变量,每个变量对应网络中的一个节点。

确定依赖关系:根据问题理解和数据分析确定变量之间的依赖关系,建立网络的DAG结构。

b. 学习参数

贝叶斯网络的参数可以通过数据学习得到,主要的学习方法包括:

参数估计:使用最大似然估计或贝叶斯估计等方法来估计每个节点的条件概率分布。这些估计可以从数据中直接计算得到。

c. 推断

贝叶斯网络通常用于推断未观察变量的状态,给定观察到的变量的状态。推断可以通过以下方法实现:

变量消去(Variable Elimination):通过计算节点的后验概率来实现推断。

信念传播算法(Belief Propagation):用于处理较大的网络,通过传播信息来计算后验概率。

EM算法的基本思想是通过迭代的方式,交替进行两个步骤:期望步(Expectation Step,E步)和最大化步(Maximization Step,M步)。这两步不断地优化参数的估计,直至收敛到局部最优解。

E步(Expectation Step):

在E步中,根据当前参数的估计,计算隐变量的后验概率(或者期望),即估计每个隐变量的条件分布。

M步(Maximization Step):

在M步中,利用E步计算得到的隐变量的后验概率,重新估计模型参数,使得对数似然函数最大化。这一步通常涉及对完整数据集(包括观察变量和隐变量)的似然函数进行优化。

这两步交替进行,直到参数收敛或达到预定的停止条件。

应用

EM算法在实际中有广泛的应用,特别是在以下场景:

高斯混合模型(Gaussian Mixture Models,GMM):

GMM是一种经典的聚类算法,它假设数据是由多个高斯分布组合而成的。EM算法可以用来估计GMM中每个高斯分布的均值、方差和混合系数。

隐马尔可夫模型(Hidden Markov Models,HMM):

HMM是一种用于序列数据分析的概率模型,其中状态序列是隐变量,观测序列是可观测变量。EM算法可以用于估计HMM中的转移概率和观测概率。

缺失数据问题:

当数据中存在缺失值时,EM算法可以用来估计模型参数。E步中计算缺失数据的后验分布,M步中最大化完整数据的对数似然函数,从而进行参数估计。

密度估计:

EM算法可以用来估计复杂的概率密度函数,尤其是在数据分布复杂或者难以建模的情况下。

下面便是两组数据的处理代码

import numpy as np
from scipy import stats
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn import svm
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 设置文件路径
file_path = '多分类水果数据.csv'
# 使用 pandas 的 read_csv 函数读取 CSV 文件,注意查看csv文件的编码,默认不填为utf-8编码
data = pd.read_csv(file_path,encoding='gbk')
# 显示数据的前几行来验证读取是否成功
print(data.head())
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
pd.set_option('display.width', 300) # 设置打印宽度(**重要**)
print(data.isnull().any())

# 检查是否存在缺失值
print("\n缺失值情况:")
print(data.isnull().sum())
# 填充或删除缺失值(这里我们选择填充为0,可以根据需要调整)
data.fillna(0, inplace=True)
# 确保每列的数据类型正确
df = data.convert_dtypes()


X = data.iloc[0:59, 1:5]  # [:)左闭右开
Y = data.iloc[0:59, 6]
# 划分数据集为训练集和验证集
X_train, X_valid, Y_train, Y_valid = train_test_split(X, Y, test_size=0.2, random_state=42)

# 高斯朴素贝叶斯
gaussian_model = svm.SVC(kernel='rbf', gamma='auto')
gaussian_model.fit(X_train, Y_train)
Y_pred = gaussian_model.predict(X_valid)
print(f"Gaussian Naive Bayes Accuracy: {accuracy_score(Y_valid, Y_pred)}")
print("\n验证集预测结果与实际结果对比:")
result_df = pd.DataFrame({'预测结果': Y_pred, '实际结果': Y_valid.values})
print(result_df)

# 多项式朴素贝叶斯
multinomial_model = svm.SVC(kernel='rbf', gamma='auto')
multinomial_model.fit(X_train, Y_train)
Y_pred = multinomial_model.predict(X_valid)
print(f"Multinomial Naive Bayes Accuracy: {accuracy_score(Y_valid, Y_pred)}")
print("\n验证集预测结果与实际结果对比:")
result_df = pd.DataFrame({'预测结果': Y_pred, '实际结果': Y_valid.values})
print(result_df)

# 伯努利朴素贝叶斯
bernoulli_model = svm.SVC(kernel='rbf', gamma='auto')
bernoulli_model.fit(X_train, Y_train)
Y_pred = bernoulli_model.predict(X_valid)
print(f"Bernoulli Naive Bayes Accuracy: {accuracy_score(Y_valid, Y_pred)}")
print("\n验证集预测结果与实际结果对比:")
result_df = pd.DataFrame({'预测结果': Y_pred, '实际结果': Y_valid.values})
print(result_df)

# 补充朴素贝叶斯
complement_model = svm.SVC(kernel='rbf', gamma='auto')
complement_model.fit(X_train, Y_train)
Y_pred = complement_model.predict(X_valid)
print(f"Complement Naive Bayes Accuracy: {accuracy_score(Y_valid, Y_pred)}")
print("\n验证集预测结果与实际结果对比:")
result_df = pd.DataFrame({'预测结果': Y_pred, '实际结果': Y_valid.values})
print(result_df)

#画图
X = data[['mass', 'width','height','color_score']].values
y = data['kind'].values  # 假设目标变量的列名

# 2. 使用 SVM 进行分类
C = 1.0  # SVM 正则化参数
svc = svm.SVC(kernel='linear', C=C).fit(X, y)

# 3. 绘制决策边界
# 创建网格以绘制决策边界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min) / 100
# 假设你的训练数据 X_train 有4个特征
xx, yy = np.meshgrid(np.linspace(-3, 3, 100), np.linspace(-3, 3, 100))
Z = svc.predict(np.c_[xx.ravel(), yy.ravel(), xx.ravel()**2, yy.ravel()**2])
Z = Z.reshape(xx.shape)

# 4. 绘制决策边界和训练数据的散点图
plt.figure(figsize=(12, 8))
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xlabel('feature1')
plt.ylabel('feature2')
plt.title('SVC with linear kernel')
plt.show()
import numpy as np
from scipy import stats
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn import svm
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import MinMaxScaler


# 设置文件路径
file_path = '多分类鸢尾花.csv'
# 使用 pandas 的 read_csv 函数读取 CSV 文件,注意查看csv文件的编码,默认不填为utf-8编码
data = pd.read_csv(file_path,encoding='gbk')
# 显示数据的前几行来验证读取是否成功
print(data.head())
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
pd.set_option('display.width', 300) # 设置打印宽度(**重要**)
print(data.isnull().any())

# 检查是否存在缺失值
print("\n缺失值情况:")
print(data.isnull().sum())
# 填充或删除缺失值(这里我们选择填充为0,可以根据需要调整)
data.fillna(0, inplace=True)
# 确保每列的数据类型正确
df = data.convert_dtypes()


X = data.iloc[0:145, 0:3]  # [:)左闭右开
Y = data.iloc[0:145, 4]
# 划分数据集为训练集和验证集
X_train, X_valid, Y_train, Y_valid = train_test_split(X, Y, test_size=0.2, random_state=42)
# 初始化 MinMaxScaler
# 将特定值映射成整数,或者排除特定值
Y_train.replace({'山鸢尾': 0}, inplace=True)  # 示例:将 '变色鸢尾' 映射成整数 0
Y_train.replace({'变色鸢尾': 1}, inplace=True)
Y_train.replace({'维吉尼亚鸢尾 ': 2}, inplace=True)
# 然后再尝试进行类型转换
Y_train = Y_train.astype(int)


# 高斯朴素贝叶斯
gaussian_model = svm.SVC(kernel='rbf', gamma='auto')
gaussian_model.fit(X_train, Y_train)
Y_pred = gaussian_model.predict(X_valid)
print(f"Gaussian Naive Bayes Accuracy: {accuracy_score(Y_valid, Y_pred)}")
print("\n验证集预测结果与实际结果对比:")
result_df = pd.DataFrame({'预测结果': Y_pred, '实际结果': Y_valid.values})
# 原始的类别名称到整数的映射关系
class_mapping = {0: '山鸢尾',1: '变色鸢尾',2: '维吉尼亚鸢尾 '}
# 使用逆向映射将整数标签转换回原始的类别名称
result_df['预测结果'] = result_df['预测结果'].map(class_mapping)
# 输出预测结果和实际结果的对比
print(result_df)


# 多项式朴素贝叶斯
multinomial_model = svm.SVC(kernel='rbf', gamma='auto')
multinomial_model.fit(X_train, Y_train)
Y_pred = multinomial_model.predict(X_valid)
print(f"Multinomial Naive Bayes Accuracy: {accuracy_score(Y_valid, Y_pred)}")
print("\n验证集预测结果与实际结果对比:")
result_df = pd.DataFrame({'预测结果': Y_pred, '实际结果': Y_valid.values})
# 原始的类别名称到整数的映射关系
class_mapping = {0: '山鸢尾',1: '变色鸢尾',2: '维吉尼亚鸢尾 '}
# 使用逆向映射将整数标签转换回原始的类别名称
result_df['预测结果'] = result_df['预测结果'].map(class_mapping)
print(result_df)

# 伯努利朴素贝叶斯
bernoulli_model = svm.SVC(kernel='rbf', gamma='auto')
bernoulli_model.fit(X_train, Y_train)
Y_pred = bernoulli_model.predict(X_valid)
print(f"Bernoulli Naive Bayes Accuracy: {accuracy_score(Y_valid, Y_pred)}")
print("\n验证集预测结果与实际结果对比:")
result_df = pd.DataFrame({'预测结果': Y_pred, '实际结果': Y_valid.values})
# 原始的类别名称到整数的映射关系
class_mapping = {0: '山鸢尾',1: '变色鸢尾',2: '维吉尼亚鸢尾 '}
# 使用逆向映射将整数标签转换回原始的类别名称
result_df['预测结果'] = result_df['预测结果'].map(class_mapping)
print(result_df)

# 补充朴素贝叶斯
complement_model = svm.SVC(kernel='rbf', gamma='auto')
complement_model.fit(X_train, Y_train)
Y_pred = complement_model.predict(X_valid)
print(f"Complement Naive Bayes Accuracy: {accuracy_score(Y_valid, Y_pred)}")
print("\n验证集预测结果与实际结果对比:")
result_df = pd.DataFrame({'预测结果': Y_pred, '实际结果': Y_valid.values})
# 原始的类别名称到整数的映射关系
class_mapping = {0: '山鸢尾',1: '变色鸢尾',2: '维吉尼亚鸢尾 '}
# 使用逆向映射将整数标签转换回原始的类别名称
result_df['预测结果'] = result_df['预测结果'].map(class_mapping)
print(result_df)

#画图
X = data[['萼片长', '萼片宽','花瓣长','花瓣长']].values
y = data['种类'].values  # 假设目标变量的列名


# 2. 使用 SVM 进行分类
C = 1.0  # SVM 正则化参数
labels = ['山鸢尾', '变色鸢尾', '维吉尼亚鸢尾','0','1','2']

# 使用 LabelEncoder 将类别标签转换为整数
label_encoder = LabelEncoder()
label_encoder.fit(labels)  # 在这里适配LabelEncoder对象以标签
y_encoded = label_encoder.transform(y)  # 转换y中的标签为整数类型


# 继续使用 SVM 进行分类
# 2. 使用 SVM 进行分类
C = 1.0  # SVM 正则化参数
svc = svm.SVC(kernel='linear', C=C).fit(X, y)

# 3. 绘制决策边界
# 创建网格以绘制决策边界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min) / 100
# 假设你的训练数据 X_train 有4个特征
xx, yy = np.meshgrid(np.linspace(-3, 3, 100), np.linspace(-3, 3, 100))
Z = svc.predict(np.c_[xx.ravel(), yy.ravel(), xx.ravel()**2, yy.ravel()**2])
Z = Z.reshape(xx.shape)

# 4. 绘制决策边界和训练数据的散点图
plt.figure(figsize=(12, 8))
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xlabel('feature1')
plt.ylabel('feature2')
plt.title('SVC with linear kernel')
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值