generated from LufsX/Experiment-kNN
This commit is contained in:
+14
-4
@@ -41,8 +41,10 @@ name = "万子玉"
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# 这里写自己的代码实现
|
# 这里写自己的代码实现
|
||||||
def euclidean_distance(a, b):
|
def mahalanobis_distance(x, mean, inv_covmat):
|
||||||
return np.sqrt(np.sum((a - b) ** 2))
|
delta = x - mean
|
||||||
|
m_dist = np.sqrt(np.dot(np.dot(delta, inv_covmat), delta.T))
|
||||||
|
return m_dist
|
||||||
|
|
||||||
def classify(input_vector, dataSet, labels, k=2):
|
def classify(input_vector, dataSet, labels, k=2):
|
||||||
"""
|
"""
|
||||||
@@ -57,7 +59,15 @@ def classify(input_vector, dataSet, labels, k=2):
|
|||||||
Returns:
|
Returns:
|
||||||
- int: 预测的分类标签。
|
- int: 预测的分类标签。
|
||||||
"""
|
"""
|
||||||
dists = [euclidean_distance(input_vector, data) for data in dataSet]
|
mean = np.mean(dataSet, axis=0)
|
||||||
|
covmat = np.cov(dataSet, rowvar=0)
|
||||||
|
inv_covmat = np.linalg.inv(covmat)
|
||||||
|
|
||||||
|
dists = [mahalanobis_distance(input_vector, mean, inv_covmat)]
|
||||||
|
|
||||||
|
for data in dataSet:
|
||||||
|
dists.append(mahalanobis_distance(data, mean, inv_covmat))
|
||||||
|
|
||||||
k_indices = np.argsort(dists)[:k]
|
k_indices = np.argsort(dists)[:k]
|
||||||
k_nearest_labels = [labels[i] for i in k_indices]
|
k_nearest_labels = [labels[i] for i in k_indices]
|
||||||
|
|
||||||
@@ -69,7 +79,7 @@ def classify(input_vector, dataSet, labels, k=2):
|
|||||||
if most_common:
|
if most_common:
|
||||||
return most_common[0][0]
|
return most_common[0][0]
|
||||||
else:
|
else:
|
||||||
return None # 或者 raise ValueError("No common labels found")
|
return None
|
||||||
|
|
||||||
|
|
||||||
# 这里也写自己的代码实现
|
# 这里也写自己的代码实现
|
||||||
|
|||||||
Reference in New Issue
Block a user