diff --git a/function.py b/function.py index 29569ae..5126797 100644 --- a/function.py +++ b/function.py @@ -41,6 +41,7 @@ name = "黎世浩" # 这里写自己的代码实现 + def classify0(inX, dataSet, labels, k=3): """ KNN 分类算法,使用马氏距离。 @@ -49,16 +50,21 @@ def classify0(inX, dataSet, labels, k=3): - inX (numpy array): 输入待分类的样本。 - dataSet (numpy array): 训练数据集。 - labels (list or numpy array): 训练集对应的标签。 - - k (int): kNN 算法参数。 + - k (int): kNN 算法参数,默认值为 3。 Returns: - int: 预测的分类标签。 """ - # 计算马氏距离 + # 计算协方差矩阵的逆和均值 inv_cov = np.linalg.inv(np.cov(dataSet.T)) # 计算协方差矩阵的逆 meanVals = np.mean(dataSet, axis=0) # 计算均值 - diffMat = inX - meanVals # 计算差值 - mahalDist = np.sqrt(diffMat.dot(inv_cov).dot(diffMat.T)) # 计算马氏距离 + + # 计算输入样本与训练集中每个样本的马氏距离 + diffMat = dataSet - meanVals + mahalDist = np.array([np.sqrt((inX - meanVals).dot(inv_cov).dot((inX - meanVals).T)) * np.sqrt(np.sum((diff - meanVals).dot(inv_cov).dot(diff - meanVals.T)) / (diffMat.shape[0] - 1)) for diff in diffMat]) + + # 确保 k 不大于训练集中的样本数量 + k = min(k, len(mahalDist)) # 对距离进行排序,选择距离最小的 k 个样本 sortedDistIndices = np.argsort(mahalDist)