generated from LufsX/Challenge-kNN
This commit is contained in:
+13
-35
@@ -41,7 +41,7 @@ name = "董秋"
|
||||
|
||||
# 这里写自己的代码实现
|
||||
import operator
|
||||
from collections import Counter
|
||||
|
||||
def classify0(inX, dataSet, labels, k=1):
|
||||
"""
|
||||
KNN 分类算法。
|
||||
@@ -55,40 +55,18 @@ def classify0(inX, dataSet, labels, k=1):
|
||||
Returns:
|
||||
- int: 预测的分类标签。
|
||||
"""
|
||||
inX = np.atleast_2d(inX)
|
||||
|
||||
# 计算训练数据集的均值向量
|
||||
meanVec = np.mean(dataSet, axis=0)
|
||||
|
||||
# 计算训练数据集的协方差矩阵
|
||||
covMat = np.cov(dataSet.T)
|
||||
|
||||
# 检查协方差矩阵是否可逆(理论上应该是可逆的,除非数据有问题)
|
||||
if np.linalg.det(covMat) == 0:
|
||||
raise ValueError("Covariance matrix is singular and cannot be inverted.")
|
||||
|
||||
# 计算协方差矩阵的逆矩阵
|
||||
invCovMat = np.linalg.inv(covMat)
|
||||
|
||||
# 计算输入样本与每个训练样本之间的马氏距离
|
||||
distances = []
|
||||
for x_train in dataSet:
|
||||
diff = inX - x_train # 计算差值向量
|
||||
diff_T = diff.T # 转置差值向量(虽然这里diff是二维的,但转置是为了保持公式的一致性)
|
||||
mahalanobis_dist = np.sqrt(np.dot(np.dot(diff_T, invCovMat), diff)) # 计算马氏距离
|
||||
distances.append(mahalanobis_dist[0, 0]) # 将距离添加到列表中(注意取标量值)
|
||||
|
||||
# 将距离列表转换为NumPy数组以便排序
|
||||
distances = np.array(distances)
|
||||
|
||||
# 按照距离排序,并获取最近的k个点的索引
|
||||
sortedDistIndicies = distances.argsort()
|
||||
|
||||
# 使用Counter来统计每个类别的计数,这样可以直接得到最频繁的类别
|
||||
classCount = Counter(labels[sortedDistIndicies[:k]])
|
||||
|
||||
# 返回出现次数最多的类别的标签
|
||||
return classCount.most_common(1)[0][0]
|
||||
dataSetSize=dataSet.shape[0]
|
||||
diffMat=inX - dataSet
|
||||
sqDiffMat=diffMat**2
|
||||
sqDistances=sqDiffMat.sum(axis=1)
|
||||
distances=sqDistances**0.5
|
||||
sortedDistIndicies=distances.argsort()
|
||||
classCount={}
|
||||
for i in range(k):
|
||||
votellabel=labels[sortedDistIndicies[i]]
|
||||
classCount[votellabel]=classCount.get(votellabel,0)+1
|
||||
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
|
||||
return sortedClassCount[0][0]
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user