generated from LufsX/Challenge-kNN
This commit is contained in:
+13
-3
@@ -61,10 +61,20 @@ def classify0(inX, dataSet, labels, k=3):
|
|||||||
covMat = np.cov(dataSet, rowvar=False)
|
covMat = np.cov(dataSet, rowvar=False)
|
||||||
meanVec = np.mean(dataSet, axis=0)
|
meanVec = np.mean(dataSet, axis=0)
|
||||||
|
|
||||||
# 计算待分类样本与训练集中每个样本的马氏距离
|
# 计算协方差矩阵的逆
|
||||||
invCovMat = np.linalg.inv(covMat)
|
invCovMat = np.linalg.inv(covMat)
|
||||||
diffVecs = dataSet - meanVec
|
|
||||||
dist = np.sqrt(np.sum((inX - meanVec).dot(invCovMat) * (inX - meanVec), axis=1))
|
# 初始化距离数组
|
||||||
|
dist = []
|
||||||
|
|
||||||
|
# 计算待分类样本与训练集中每个样本的马氏距离
|
||||||
|
for i in range(dataSet.shape[0]):
|
||||||
|
diffVec = dataSet[i, :] - inX
|
||||||
|
# 避免除以零的情况
|
||||||
|
if np.linalg.det(covMat) == 0:
|
||||||
|
dist.append(np.linalg.norm(diffVec))
|
||||||
|
else:
|
||||||
|
dist.append(np.sqrt(diffVec.dot(invCovMat).dot(diffVec.T)))
|
||||||
|
|
||||||
# 获取距离最近的 k 个样本的索引
|
# 获取距离最近的 k 个样本的索引
|
||||||
kNearestIndices = np.argsort(dist)[:k]
|
kNearestIndices = np.argsort(dist)[:k]
|
||||||
|
|||||||
Reference in New Issue
Block a user