generated from LufsX/Challenge-kNN
This commit is contained in:
+12
-34
@@ -41,7 +41,7 @@ name = "董秋"
|
|||||||
|
|
||||||
# 这里写自己的代码实现
|
# 这里写自己的代码实现
|
||||||
import operator
|
import operator
|
||||||
from collections import Counter
|
|
||||||
def classify0(inX, dataSet, labels, k=1):
|
def classify0(inX, dataSet, labels, k=1):
|
||||||
"""
|
"""
|
||||||
KNN 分类算法。
|
KNN 分类算法。
|
||||||
@@ -55,40 +55,18 @@ def classify0(inX, dataSet, labels, k=1):
|
|||||||
Returns:
|
Returns:
|
||||||
- int: 预测的分类标签。
|
- int: 预测的分类标签。
|
||||||
"""
|
"""
|
||||||
inX = np.atleast_2d(inX)
|
dataSetSize=dataSet.shape[0]
|
||||||
|
diffMat=inX - dataSet
|
||||||
# 计算训练数据集的均值向量
|
sqDiffMat=diffMat**2
|
||||||
meanVec = np.mean(dataSet, axis=0)
|
sqDistances=sqDiffMat.sum(axis=1)
|
||||||
|
distances=sqDistances**0.5
|
||||||
# 计算训练数据集的协方差矩阵
|
|
||||||
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()
|
sortedDistIndicies=distances.argsort()
|
||||||
|
classCount={}
|
||||||
# 使用Counter来统计每个类别的计数,这样可以直接得到最频繁的类别
|
for i in range(k):
|
||||||
classCount = Counter(labels[sortedDistIndicies[:k]])
|
votellabel=labels[sortedDistIndicies[i]]
|
||||||
|
classCount[votellabel]=classCount.get(votellabel,0)+1
|
||||||
# 返回出现次数最多的类别的标签
|
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
|
||||||
return classCount.most_common(1)[0][0]
|
return sortedClassCount[0][0]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user