generated from LufsX/Challenge-kNN
This commit is contained in:
+17
-19
@@ -1,6 +1,7 @@
|
|||||||
# function.py
|
# function.py
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from numpy.linalg import inv, det
|
from numpy.linalg import inv, det
|
||||||
|
from scipy.stats import mode
|
||||||
"""
|
"""
|
||||||
挑战说明:
|
挑战说明:
|
||||||
- 自行编写实现 KNN 分类算法。
|
- 自行编写实现 KNN 分类算法。
|
||||||
@@ -38,7 +39,7 @@ name = "潘宇豪"
|
|||||||
|
|
||||||
|
|
||||||
# 这里写自己的代码实现
|
# 这里写自己的代码实现
|
||||||
def classify0(inX, dataSet, labels, k=3):
|
def classify0(inX, dataSet, labels, ,k_values = [3,9]):
|
||||||
"""
|
"""
|
||||||
KNN 分类算法。
|
KNN 分类算法。
|
||||||
|
|
||||||
@@ -52,32 +53,29 @@ def classify0(inX, dataSet, labels, k=3):
|
|||||||
- int: 预测的分类标签。
|
- int: 预测的分类标签。
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def mahalanobis_distance(inX, data, cov_inv):
|
||||||
|
diff = inX - data
|
||||||
|
return np.sqrt(np.dot(np.dot(diff, cov_inv), diff.T))
|
||||||
|
|
||||||
mean = np.mean(dataSet, axis=0)
|
mean = np.mean(dataSet, axis=0)
|
||||||
cov_inv = inv(np.cov(dataSet, rowvar=False))
|
cov_inv = inv(np.cov(dataSet, rowvar=False))
|
||||||
|
|
||||||
# 计算马氏距离
|
# 计算所有k值的预测
|
||||||
distances = []
|
predictions = []
|
||||||
for data in dataSet:
|
for k in k_values:
|
||||||
diff = inX - data
|
distances = [mahalanobis_distance(inX, data, cov_inv) for data in dataSet]
|
||||||
distance = np.sqrt(np.dot(np.dot(diff, cov_inv), diff.T))
|
sortedDistIndices = np.argsort(distances)
|
||||||
distances.append(distance)
|
|
||||||
|
|
||||||
distances = np.array(distances)
|
|
||||||
sortedDistIndices = distances.argsort()
|
|
||||||
|
|
||||||
# 距离加权投票
|
|
||||||
classCount = {}
|
classCount = {}
|
||||||
for i in range(k):
|
for i in range(k):
|
||||||
index = sortedDistIndices[i]
|
voteIlabel = labels[sortedDistIndices[i]]
|
||||||
voteIlabel = labels[index]
|
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
|
||||||
weight = 1 / (distances[index] + 1e-5) # 使用距离的倒数作为权重,避免除以零
|
|
||||||
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + weight
|
|
||||||
|
|
||||||
# 返回权重最高的类别
|
|
||||||
sortedClassCount = sorted(classCount.items(), key=lambda item: item[1], reverse=True)
|
sortedClassCount = sorted(classCount.items(), key=lambda item: item[1], reverse=True)
|
||||||
return sortedClassCount[0][0]
|
predictions.append(sortedClassCount[0][0])
|
||||||
|
|
||||||
|
|
||||||
|
# 多数投票机制
|
||||||
|
final_prediction, _ = mode(predictions)
|
||||||
|
return final_prediction.mode[0]
|
||||||
|
|
||||||
def load_data(file_path):
|
def load_data(file_path):
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user