import cv2 import math import numpy as np import pandas as pd from sklearn.neighbors import KNeighborsClassifier

一些全局变量

distance_threshold = 121 # 设置KNN距离阈值 neighbors = 2 # 邻居

加载动作数据集

warmup_df = pd.read_csv('dataset_warm-up.csv') combat_df = pd.read_csv('dataset_SHIZHAN POSE.csv') attack_df = pd.read_csv('dataset_hit.csv') respect_df = pd.read_csv('dataset_respect.csv') gongbu_df = pd.read_csv('dataset_gongbu.csv')

数据清洗

将每个小数据集中偏离平均值超过2倍标准差的样本删除

print('数据清洗') for df in [warmup_df, combat_df, attack_df, respect_df, gongbu_df]: df.drop(df[(np.abs(df[['angle1','angle2','angle3', 'angle4','angle5','angle5_1' ,'angle6', 'angle7','angle8','angle9','angle10','angle11']] - df[['angle1','angle2','angle3', 'angle4','angle5','angle5_1' ,'angle6', 'angle7','angle8','angle9','angle10','angle11']].mean()) > 2 * df[['angle1','angle2','angle3', 'angle4','angle5' ,'angle6', 'angle7','angle8','angle9','angle10','angle11']].std()).any(axis=1)].index, inplace=True)

将数据集合并为一个大的数据集

data = pd.concat([warmup_df, combat_df, attack_df, respect_df, gongbu_df], ignore_index=True)

训练KNN分类器

print('开始训练knn') knn = KNeighborsClassifier(n_neighbors=neighbors, weights='distance', metric='manhattan') knn.fit(data[['angle1','angle2','angle3', 'angle4','angle5','angle5_1' ,'angle6', 'angle7','angle8','angle9','angle10','angle11']], data['label'])

import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap

取出训练集中的特征和标签

X = data[['angle1','angle2','angle3', 'angle4','angle5','angle5_1' ,'angle6', 'angle7','angle8','angle9','angle10','angle11']] y = data['label']

将特征缩放到[0, 1]范围内

X_normalized = (X - X.min()) / (X.max() - X.min())

将特征降维到二维

from sklearn.decomposition import PCA pca = PCA(n_components=2) X_pca = pca.fit_transform(X_normalized)

训练KNN分类器

knn = KNeighborsClassifier(n_neighbors=neighbors, weights='distance', metric='manhattan') knn.fit(X_pca, y)

绘制分类器的决策边界

解决报错 TypeError: iteration over a 0-d array

if X_pca.ndim == 1: print('数据集中只有一条记录,无法绘制决策边界') else: cmap_light = ListedColormap(['#AAAAFF', '#FFAAAA', '#AAFFAA', '#AFAFAF']) cmap_bold = ListedColormap(['#0000FF', '#FF0000', '#00FF00', '#AFAFAF'])

h = .02  # 步长
x_min, x_max = X_pca[:, 0].min() - 0.1, X_pca[:, 0].max() + 0.1
y_min, y_max = X_pca[:, 1].min() - 0.1, X_pca[:, 1].max() + 0.1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape)
plt.figure(figsize=(8, 6))
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)

# 绘制训练集中的样本点
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y.astype('category').cat.codes, cmap=cmap_bold, edgecolor='k', s=20)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title('KNN decision boundary')
plt.xlabel('PCA1')
plt.ylabel('PCA2')
plt.show()
KNN 分类器决策边界可视化:Python 实现与错误解决

原文地址: https://www.cveoy.top/t/topic/gQ04 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录