呆板学习k近邻,高斯淳厚贝叶斯分类器

打印 上一主题 下一主题

主题 1937|帖子 1937|积分 5811

1、k近邻分类

  1. #  2-14 k近邻分类
  2. import pandas as pd
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. from scipy import stats  # 导入stats
  6. # 参数设置
  7. knn_k_max = 20  # k近邻中的最大k值
  8. folds = 4  # k份交叉验证的份数k
  9. # 读入轮椅数据集
  10. df = pd.read_csv('wheelchair_dataset.csv')
  11. data = np.array(df)
  12. m_all = np.shape(data)[0]  # 样本总数
  13. d = np.shape(data)[1] - 1  # 输入特征的维数
  14. classes = np.amax(data[:, d])  # 类别数量
  15. m_test = m_all // folds  # 测试数据集中样本的数量
  16. m_train = m_test * (folds - 1)  # 训练数据集中样本的数量
  17. # 构造随机种子为指定值的随机数生成器,并对数据集中样本随机排序
  18. rng = np.random.default_rng(1)
  19. rng.shuffle(data)
  20. # 对所有样本的输入特征进行归一化(因取值范围已知)
  21. data = data.astype(float)
  22. data[:, 0:d - 1] = (data[:, 0:d - 1] - 0) / (1023 - 0)  # 归一化压力传感器读数
  23. data[:, d - 1] = (data[:, d - 1] - 0) / (50 - 0)  # 归一化超声波传感器的读数
  24. #  用于保存分类错误的数量
  25. train_errors = np.zeros(knn_k_max)
  26. test_errors = np.zeros(knn_k_max)
  27. #  对k份交叉验证的k个不同数据集划分进行循环
  28. for kfold_k in range(folds):
  29.     test_start = kfold_k * m_test  # 测试数据集中第一个样本的索引
  30.     # 划分数据集
  31.     X_test = data[test_start:test_start + m_test, 0:d]
  32.     Y_test = data[test_start:test_start + m_test, d]
  33.     X_train_p1 = data[0:test_start, 0:d]  # 训练数据集输入特征的前一部分
  34.     X_train_p2 = data[test_start + m_test:, 0:d]  # 训练数据集输入特征的后一部分
  35.     X_train = np.concatenate((X_train_p1, X_train_p2), axis=0)  # 连接训练数据集输入特征数组
  36.     Y_train_p1 = data[0:test_start, d]  # 训练数据集标注的前一部分
  37.     Y_train_p2 = data[test_start + m_test:, d]  # 训练数据集标注的后一部分
  38.     Y_train = np.concatenate((Y_train_p1, Y_train_p2), axis=0)  # 连接训练数据集输入特征数组
  39.     #  对k近邻中的k进行循环
  40.     for knn_k in range(1, knn_k_max + 1):  # 对测试数据集中的每个样本
  41.         for i in range(m_test):
  42.             X = X_test[i, :].reshape((1, -1))  # 当前样本的总输入特征
  43.             Y = Y_test[i]  # 当前样本的标注
  44.             diff = X - X_train  # 当前样本与训练数据集中所有样本的输入特征之差
  45.             dist = np.sum(diff * diff, axis=1)  # 计算距离的平方
  46.             sorted_index = np.argsort(dist)  # 对距离排序并得到排序后的索引
  47.             k_index = sorted_index[0:knn_k]  # 前k个训练样本的索引
  48.             k_label = Y_train[k_index]  # 前k个训练样本的标注
  49.             Y_hat = stats.mode(k_label, keepdims=True).mode[0]  # 把前k个训练样本标注的众数作为预测类别值
  50.             # 累加测试数据集上的分类错误数量
  51.             if(Y_hat !=Y):
  52.                 test_errors[knn_k-1]=test_errors[knn_k-1]+1
  53.         # 对训练数据集中每一个样本
  54.         for i in range(m_train):
  55.             X = X_train[i, :].reshape((1, -1))  # 当前样本的总输入特征
  56.             Y = Y_train[i]  # 当前样本的标注
  57.             diff = X - X_train  # 当前样本与训练数据集中所有样本的输入特征之差
  58.             dist = np.sum(diff * diff, axis=1)  # 计算距离的平方
  59.             sorted_index = np.argsort(dist)  # 对距离排序并得到排序后的索引
  60.             k_index = sorted_index[0:knn_k]  # 前k个训练样本的索引
  61.             k_label = Y_train[k_index]  # 前k个训练样本的标注
  62.             Y_hat = stats.mode(k_label, keepdims=True).mode[0]  # 把前k个训练样本标注的众数作为预测类别值
  63.             # 累加训练数据集上的分类错误数量
  64.             if(Y_hat !=Y):
  65.                 train_errors[knn_k-1]=train_errors[knn_k-1]+1
  66. # 画出两个数据集上的分类错误线
  67. plt.plot(np.arange(1, knn_k_max + 1), train_errors, 'r-o', linewidth=2, markersize=5)
  68. plt.plot(np.arange(1, knn_k_max + 1), test_errors, 'b-s', linewidth=2, markersize=5)
  69. plt.ylabel('Number of errors')
  70. plt.xlabel('k of k-NN')
  71. plt.legend(['Traininng dataset', 'Test dataset'])
  72. plt.show()
复制代码
效果图

2、高斯淳厚贝叶斯分类器

  1. #  2-16 高斯朴素贝叶斯分类器
  2. import pandas
  3. import numpy as np
  4. # 参数设置
  5. m_train = 200  # 训练样本数量
  6. # 读入轮椅数据
  7. df = pandas.read_csv('wheelchair_dataset.csv')
  8. data = np.array(df)
  9. m_all = np.shape(data)[0]  # 样本数量
  10. d = np.shape(data)[1] - 1  # 输入特征维数
  11. m_test = m_all - m_train  # 测试样本的数量
  12. # 构造随机种子为指定值的随机数生成器,并对数据集中的样本随机排序
  13. rng = np.random.default_rng(1)
  14. rng.shuffle(data)
  15. # 划分数据集
  16. X_train = data[0:m_train, 0:d]
  17. y_train = data[0:m_train, d]
  18. X_test = data[m_train:, 0:d]
  19. y_test = data[m_train:, d]
  20. # 用于保存混淆矩阵
  21. test_conf_mat = np.zeros((classes, classes))  # 测试数据集混淆矩阵
  22. train_conf_mat = np.zeros((classes, classes))  # 训练数据集混淆矩阵
  23. # 用于保存高斯朴素贝叶斯分类器的参数
  24. gnb_priors = np.zeros(classes).reshape((-1, 1))  # 各个类别的先验概率
  25. gnb_means = np.zeros((classes, d))  # 均值
  26. gnb_stds = np.zeros((classes, d))  # 标准差
  27. # 训练(估算参数)
  28. for c in range(classes):  # 对于每一个类别
  29.     x_class_c = np.compress(y_train == c + 1, X_train, axis=0)  # 从训练数据集中抽取该类别训练样本的输入特征
  30.     gnb_priors[c, 0] = np.shape(x_class_c)[0] / m_train  # 估算该类别的先验概率
  31.     gnb_means[c, :] = np.mean(x_class_c, axis=0)  # 估算该类别训练样本各维输入特征的均值
  32.     gnb_stds[c, :] = np.std(x_class_c, axis=0, ddof=1)  # 估算该类别训练样本各维输入特征的标准差
  33. # 预测(测试数据集)
  34. for i in range(m_test):  # 对测试数据集中每一个样本
  35.     x = X_test[i, :].reshape((1, -1))  # 样本的输入特征
  36.     std_x = (x - gnb_means) / gnb_stds  # 标准化输入特征
  37.     p_class = np.log(gnb_priors) - np.sum(0.5 * std_x * std_x + np.log(gnb_stds), axis=1).reshape(
  38.         (-1, 1))  # 该输入特征对应为各个类别的可能性
  39.     y_hat = np.argmax(p_class) + 1  # 预测:样本对应为可能性最大的类别
  40.     # 累加测试数据集上的混淆矩阵
  41.     y = y_test[i]
  42.     test_conf_mat[y_hat - 1, y - 1] = test_conf_mat[y_hat - 1, y - 1] + 1
  43. # 预测(训练数据集)
  44. for i in range(m_train):  # 对训练数据集中每一个样本
  45.     x = X_train[i, :].reshape((1, -1))  # 样本的输入特征
  46.     std_x = (x - gnb_means) / gnb_stds  # 标准化输入特征
  47.     p_class = np.log(gnb_priors) - np.sum(0.5 * std_x * std_x + np.log(gnb_stds), axis=1).reshape(
  48.         (-1, 1))  # 该输入特征对应为各个类别的可能性
  49.     y_hat = np.argmax(p_class) + 1  # 预测:样本对应为可能性最大的类别
  50.     #  累加训练数据集上的混淆矩阵
  51.     y = y_train[i]
  52.     train_conf_mat[y_hat - 1, y - 1] = train_conf_mat[y_hat - 1, y - 1] + 1
  53. # 清零累加变量
  54. F1_acc_test, F1_acc_train = 0, 0
  55. # 累加测试数据集和训练数据集上各个类别的F1值
  56. for c in range(classes):
  57.     precision_test = test_conf_mat[c, c] / np.sum(test_conf_mat[c, :])
  58.     recall_test = test_conf_mat[c, c] / np.sum(test_conf_mat[:, c])
  59.     F1_acc_test = F1_acc_test + 2 * precision_test * recall_test / (precision_test + recall_test)
  60.     precision_train = train_conf_mat[c, c] / np.sum(train_conf_mat[c, :])
  61.     recall_train = train_conf_mat[c, c] / np.sum(train_conf_mat[:, c])
  62.     F1_acc_train = F1_acc_train + 2 * precision_train * recall_train / (precision_train + recall_train)
  63. # 计算宏平均F1值
  64. test_macro_F1 = F1_acc_test / classes
  65. train_macro_F1 = F1_acc_train / classes
  66. # 计算训练数据集和测试数据集上的马修斯相关系数
  67. test_MCC_a = np.sum(test_conf_mat)
  68. test_MCC_s = np.trace(test_conf_mat)
  69. test_MCC_h = np.sum(test_conf_mat, axis=1)
  70. test_MCC_l = np.sum(test_conf_mat, axis=0)
  71. test_MCC = (test_MCC_a * test_MCC_s - np.dot(test_MCC_h, test_MCC_l)) / np.sqrt(
  72.     (test_MCC_a * test_MCC_a - np.dot(test_MCC_h, test_MCC_h)) * (
  73.                 test_MCC_a * test_MCC_a - np.dot(test_MCC_l, test_MCC_l)))
  74. train_MCC_a = np.sum(train_conf_mat)
  75. train_MCC_s = np.trace(train_conf_mat)
  76. train_MCC_h = np.sum(train_conf_mat, axis=1)
  77. train_MCC_l = np.sum(train_conf_mat, axis=0)
  78. train_MCC = (train_MCC_a * train_MCC_s - np.dot(train_MCC_h, train_MCC_l)) / np.sqrt(
  79.     (train_MCC_a * train_MCC_a - np.dot(train_MCC_h, train_MCC_h)) * (
  80.                 train_MCC_a * train_MCC_a - np.dot(train_MCC_l, train_MCC_l)))
  81. # 打印结果
  82. print(f'Testset macro F1 = {test_macro_F1:.3f}')
  83. print(f'Testset MCC = {test_MCC:.3f}')
  84. print(f'Trainset macro F1 = {train_macro_F1:.3f}')
  85. print(f'Trainset MCC = {train_MCC:.3f}')
复制代码
效果图


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表