最近质心分类法是一种基于距离的监督学习算法,用于分类问题。该方法的核心思想是找到每个类别的质心(即该类别所有样本点的均值),然后对于一个新的样本点,将其分配给最近的质心所代表的类别。下面是一个使用Python的scikit-learn库实现最近质心分类法的示例,包括数据的加载、模型的训练和预测,以及决策边界的可视化。
首先,需要导入必要的库和模块,包括matplotlib用于绘图,numpy用于数值计算,以及scikit-learn库中的相关模块。然后,加载iris数据集,并只取前两个特征用于分类。接下来,创建一个最近质心分类器的实例,并使用不同的收缩阈值(shrink_threshold)来训练模型。最后,绘制决策边界和训练点,以直观地展示分类效果。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap
from sklearn import datasets
from sklearn.inspection import DecisionBoundaryDisplay
from sklearn.neighbors import NearestCentroid
# 加载iris数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 只取前两个特征
y = iris.target
# 创建颜色映射
cmap_light = ListedColormap(['orange', 'cyan', 'cornflowerblue'])
cmap_bold = ListedColormap(['darkorange', 'c', 'darkblue'])
# 遍历不同的收缩阈值
for shrinkage in [None, 0.2]:
# 创建最近质心分类器实例并训练
clf = NearestCentroid(shrink_threshold=shrinkage)
clf.fit(X, y)
y_pred = clf.predict(X)
print(shrinkage, np.mean(y == y_pred))
# 绘制决策边界和训练点
_, ax = plt.subplots()
DecisionBoundaryDisplay.from_estimator(clf, X, cmap=cmap_light, ax=ax, response_method="predict")
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold, edgecolor='k', s=20)
plt.title("3-Class classification (shrink_threshold=%r)" % shrinkage)
plt.axis("tight")
plt.show()
在上述代码中,首先定义了两个颜色映射(cmap_light和cmap_bold),分别用于绘制决策边界和训练点。然后,遍历两个不同的收缩阈值(None和0.2),对于每个收缩阈值,创建一个最近质心分类器的实例,并使用fit方法训练模型。接着,使用predict方法对训练数据进行预测,并计算准确率。最后,使用subplots方法创建一个绘图区域,并使用DecisionBoundaryDisplay.from_estimator方法绘制决策边界。同时,使用scatter方法绘制训练点,并设置颜色映射、边缘颜色和大小。最后,设置图表的标题、坐标轴,并显示图表。
通过上述代码,可以直观地看到不同收缩阈值下,最近质心分类器对iris数据集的分类效果。决策边界清晰地展示了每个类别的划分区域,而训练点则展示了每个样本点的类别归属。通过比较不同收缩阈值下的分类效果,可以选择合适的收缩阈值来优化模型的性能。
总的来说,最近质心分类法是一种简单而有效的分类算法,特别适合于小规模数据集。通过调整收缩阈值,可以在一定程度上控制模型的复杂度,从而在偏差和方差之间取得平衡。同时,决策边界的可视化也为提供了一种直观的方式来评估和比较不同模型的性能。