generated from LufsX/Experiment-kNN
This commit is contained in:
+14
-3
@@ -42,11 +42,22 @@ def classify(input_vector, dataSet, labels, k=2):
|
||||
- int: 预测的分类标签。
|
||||
"""
|
||||
num_samples = dataSet.shape[0]
|
||||
diffs = np.tile(input_vector, (num_samples, 1)) - dataSet
|
||||
distances = np.sum(diffs**2, axis=1)**0.5
|
||||
mu = np.mean(dataSet, axis = 0)
|
||||
cov = np.cov(dataSet.T)
|
||||
try:
|
||||
inv_cov = np.linalg.inv(cov)
|
||||
except np.linalg.LinAlgError:
|
||||
# 如果协方差矩阵不可逆,使用伪逆
|
||||
inv_cov = np.linalg.pinv(cov)
|
||||
distances = []
|
||||
for i in range(num_samples):
|
||||
diff = (input_vector - dataSet[i])
|
||||
distance = np.sqrt(np.dot(np.dot(diff, inv_cov), diff.T))
|
||||
distances.append(distance)
|
||||
distances = np.array(distances)
|
||||
sorted_indices = np.argsort(distances)
|
||||
k_nearest_labels = [labels[i] for i in sorted_indices[:k]]
|
||||
unique_labels, counts = np.unique(k_nearest_labels, return_counts=True)
|
||||
unique_labels, counts = np.unique(k_nearest_labels, return_counts = True)
|
||||
return unique_labels[np.argmax(counts)]
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user