以机器学习西瓜的好坏为例,写出朴素贝叶斯算法判断西瓜好坏的程序
时间: 2023-05-23 13:07:39 浏览: 188
我可以为您提供一个Python实现的朴素贝叶斯算法判断西瓜好坏的程序,代码如下:
``` python
import pandas as pd
# 西瓜样本数据集
watermelon_data = pd.DataFrame({
'是否成熟': ['否', '否', '否', '否', '否', '是', '是', '是', '是', '是', '否', '否', '是', '是', '否'],
'形状': ['长', '短', '短', '长', '短', '长', '短', '短', '长', '长', '长', '短', '短', '长', '长'],
'颜色': ['青绿', '乌黑', '乌黑', '青绿', '浅白', '青绿', '浅白', '乌黑', '浅白', '青绿', '浅白', '乌黑', '浅白', '青绿', '乌黑'],
'敲声': ['浊响', '沉闷', '沉闷', '浊响', '浊响', '浊响', '沉闷', '浊响', '清脆', '浊响', '清脆', '沉闷', '沉闷', '浊响', '沉闷'],
'纹理': ['清晰', '清晰', '清晰', '清晰', '清晰', '稍糊', '稍糊', '稍糊', '清晰', '稍糊', '稍糊', '稍糊', '清晰', '稍糊', '清晰'],
'脐部': ['凹陷', '凹陷', '凹陷', '凹陷', '凹陷', '稍凹', '稍凹', '稍凹', '平坦', '平坦', '平坦', '稍凹', '稍凹', '凹陷', '平坦'],
'触感': ['硬滑', '硬滑', '硬滑', '硬滑', '硬滑', '软粘', '软粘', '硬滑', '软粘', '硬滑', '硬滑', '硬滑', '沉闷', '硬滑', '软粘'],
'好瓜': ['否', '否', '是', '是', '否', '是', '否', '否', '是', '是', '是', '否', '是', '是', '否']
})
# 将特征变量和目标变量分开
X = watermelon_data.drop(columns=['好瓜'])
y = watermelon_data['好瓜']
# 计算每个特征的可能性和类别的可能性
def calc_feature_prob(X, y, feature_name, feature_value, target_value):
X_sub = X[y == target_value]
num_target_rows = X_sub.shape[0]
num_target_rows_with_feature = X_sub[X_sub[feature_name] == feature_value].shape[0]
return (num_target_rows_with_feature + 1) / (num_target_rows + 2)
def calc_class_prob(X, y, target_value):
num_total_rows = y.shape[0]
num_target_rows = y[y == target_value].shape[0]
return (num_target_rows + 1) / (num_total_rows + 2)
# 判断每个实例的类别
def predict(X_new, X, y):
classes = y.unique()
class_probs = [calc_class_prob(X, y, c) for c in classes]
feature_names = X.columns.values
feature_probs = []
for i in range(X_new.shape[0]):
row_probs = []
row = X_new.iloc[i, :]
for c in classes:
for j in range(len(feature_names)):
feature_name = feature_names[j]
feature_value = row[feature_name]
prob = calc_feature_prob(X, y, feature_name, feature_value, c)
row_probs.append(prob)
feature_probs.append(row_probs)
df_prob = pd.DataFrame(feature_probs, columns=[f"{c}_prob" for c in classes for _ in feature_names])
df_prob['p'] = 1
for c in classes:
class_prob = df_prob[f'{c}_prob'].values
df_prob['p'] = df_prob['p'] * class_prob
return classes[df_prob['p'].idxmax()]
# 测试
X_new = pd.DataFrame({
'是否成熟': ['是'],
'形状': ['长'],
'颜色': ['青绿'],
'敲声': ['清脆'],
'纹理': ['清晰'],
'脐部': ['凹陷'],
'触感': ['硬滑']
})
print(predict(X_new, X, y))
```
上述程序中,我们使用了一个人工构造的西瓜样本数据集作为训练数据。首先,我们将特征变量和目标变量分开,然后实现了一个`calc_feature_prob`函数和一个`calc_class_prob`函数来计算每个特征和每个类别的可能性。接着,我们实现了一个`predict`函数来预测每个实例的类别:首先计算每个类别的可能性,然后计算每个特征的可能性,最后将这些可能性相乘得到每个类别的总可能性,并选择总可能性最大的类别作为预测结果。最后,我们使用一个测试集来测试模型的准确性。
阅读全文