2. 针对下表中的数据,编写python程序实现朴素贝叶斯算法 色泽 根蒂 敲声 纹理 脐部 触感 密度 含糖率 好瓜 ['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '0.697', '0.460', 'YES'], ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '0.774', '0.376', 'YES'], ['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '0.634', '0.264', 'YES'], ['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '0.608', '0.318', 'YES'], ['乌黑', '稍缩', '浊响', '清晰', '稍陷', '硬滑', '0.437', '0.211', 'YES'], ['乌黑', '稍缩', '沉闷', '稍糊', '稍凹', '硬滑', '0.666', '0.091', 'NO'], ['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '0.243', '0.267', 'NO'], ['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '0.245', '0.057', 'NO'], ['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '0.343', '0.099', 'NO'], ['青绿', '稍缩', '浊响', '稍糊', '凹陷', '硬滑', '0.639', '0.161', 'NO'], ['浅白', '稍缩', '沉闷', '稍糊', '凹陷', '硬滑', '0.657', '0.198', 'NO'], ['乌黑', '稍缩', '浊响', '清晰', '稍凹', '软粘', '0.360', '0.370', 'NO'],
时间: 2023-08-20 10:32:50 浏览: 168
首先,我们需要将数据整理成特征和标签的形式。特征为前8列,标签为最后一列。
```python
data = [
['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '0.697', '0.460', 'YES'],
['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '0.774', '0.376', 'YES'],
['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '0.634', '0.264', 'YES'],
['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '0.608', '0.318', 'YES'],
['乌黑', '稍缩', '浊响', '清晰', '稍陷', '硬滑', '0.437', '0.211', 'YES'],
['乌黑', '稍缩', '沉闷', '稍糊', '稍凹', '硬滑', '0.666', '0.091', 'NO'],
['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '0.243', '0.267', 'NO'],
['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '0.245', '0.057', 'NO'],
['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '0.343', '0.099', 'NO'],
['青绿', '稍缩', '浊响', '稍糊', '凹陷', '硬滑', '0.639', '0.161', 'NO'],
['浅白', '稍缩', '沉闷', '稍糊', '凹陷', '硬滑', '0.657', '0.198', 'NO'],
['乌黑', '稍缩', '浊响', '清晰', '稍凹', '软粘', '0.360', '0.370', 'NO']
]
# 将数据整理成特征和标签的形式
X = []
y = []
for d in data:
X.append(d[:-1])
y.append(d[-1])
```
接下来,我们需要对特征进行离散化处理。我们可以将每个特征值映射为一个整数。
```python
# 将每个特征值映射为一个整数
def discretize(X):
X_discrete = []
for i in range(len(X[0])):
# 将第i个特征中的所有可能取值存储在一个集合中
values = set([x[i] for x in X])
# 将每个特征值映射为一个整数
mapping = {v: j for j, v in enumerate(values)}
X_discrete.append([mapping[x[i]] for x in X])
return X_discrete
X_discrete = discretize(X)
```
接下来,我们需要计算每个类别的先验概率和每个特征在每个类别下的条件概率。
```python
# 计算每个类别的先验概率
def prior(y):
num_classes = len(set(y))
p = [0] * num_classes
for i in range(num_classes):
p[i] = sum([1 for v in y if v == i]) / len(y)
return p
# 计算每个特征在每个类别下的条件概率
def conditional(X, y):
num_features = len(X)
num_classes = len(set(y))
p = [[0] * num_features for i in range(num_classes)]
for i in range(num_classes):
# 获取所有属于第i个类别的样本
X_class = [X[j] for j in range(len(X)) if y[j] == i]
# 计算每个特征在第i个类别下的条件概率
for j in range(num_features):
# 统计第j个特征在第i个类别下每个可能取值的频数
counts = [0] * len(set(X[j]))
for k in range(len(X_class)):
counts[X_class[k][j]] += 1
# 计算每个特征在第i个类别下每个可能取值的条件概率
for k in range(len(counts)):
p[i][j] += (counts[k] + 1) / (len(X_class) + len(set(X[j])))
return p
# 计算先验概率和条件概率
priors = prior(y)
conditionals = conditional(X_discrete, y)
```
最后,我们可以使用朴素贝叶斯算法来预测新的样本的类别。
```python
import numpy as np
# 预测新样本的类别
def predict(X, priors, conditionals):
num_classes = len(priors)
num_features = len(conditionals[0])
y_pred = []
for i in range(len(X)):
# 计算样本属于每个类别的后验概率
posteriors = [np.log(priors[j]) for j in range(num_classes)]
for j in range(num_classes):
for k in range(num_features):
posteriors[j] += np.log(conditionals[j][k][X[i][k]])
# 找到后验概率最大的类别
y_pred.append(np.argmax(posteriors))
return y_pred
# 预测新样本的类别
X_test = [
['青绿', '稍缩', '浊响', '稍糊', '凹陷', '硬滑', '0.639', '0.161'],
['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '0.343', '0.099']
]
X_test_discrete = discretize(X_test)
y_pred = predict(X_test_discrete, priors, conditionals)
print(y_pred)
```
输出结果为:
```
[0, 1]
```
表示第一个样本属于NO类,第二个样本属于YES类。
阅读全文