更新 function.py
Gitea Actions Challenge Test / Challenge-Actions (push) Successful in 11s

This commit is contained in:
hao
2024-10-15 19:54:23 +08:00
parent 20a487e231
commit 377ce73c89
+12 -12
View File
@@ -41,9 +41,9 @@ name = "黎世浩"
# 这里写自己的代码实现 # 这里写自己的代码实现
def classify0(inX, dataSet, labels, k=2): def classify0(inX, dataSet, labels, k=3):
""" """
KNN 分类算法。 KNN 分类算法,使用马氏距离。
Args: Args:
- inX (numpy array): 输入待分类的样本。 - inX (numpy array): 输入待分类的样本。
@@ -54,21 +54,21 @@ def classify0(inX, dataSet, labels, k=2):
Returns: Returns:
- int: 预测的分类标签。 - int: 预测的分类标签。
""" """
# 计算输入样本与数据集中每个样本的欧氏距离 # 计算马氏距离
diffMat = np.tile(inX, (dataSet.shape[0], 1)) - dataSet inv_cov = np.linalg.inv(np.cov(dataSet.T)) # 计算协方差矩阵的逆
sqDiffMat = diffMat ** 2 meanVals = np.mean(dataSet, axis=0) # 计算均值
sqDistances = sqDiffMat.sum(axis=1) diffMat = inX - meanVals # 计算差值
distances = sqDistances ** 0.5 mahalDist = np.sqrt(diffMat.dot(inv_cov).dot(diffMat.T)) # 计算马氏距离
# 对距离进行排序,选择距离最小的 k 个样本 # 对距离进行排序,选择距离最小的 k 个样本
sortedDistIndices = distances.argsort() sortedDistIndices = np.argsort(mahalDist)
classCount = {} classCount = {}
# 遍历距离最小的 k 个样本,统计每个类别的出现次数 # 遍历距离最小的 k 个样本,统计每个类别的出现次数
for i in range(k): for i in range(k):
voteIlabel = labels[sortedDistIndices[i]] voteIlabel = labels[sortedDistIndices[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
# 选择出现次数最多的类别作为预测标签 # 选择出现次数最多的类别作为预测标签
sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True) sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True)
return sortedClassCount[0][0] return sortedClassCount[0][0]
@@ -85,4 +85,4 @@ def load_data(file_path):
if __name__ == "__main__": if __name__ == "__main__":
train_file = "datingTrainSet2.tsv" train_file = "datingTrainSet2.tsv"
train_data, train_labels = load_data(train_file) train_data, train_labels = load_data(train_file)
print(classify0([65915, 3.868359, 0.128078], train_data, train_labels)) print(classify0([65915, 3.868359, 0.128078], train_data, train_labels))