generated from LufsX/Challenge-kNN
This commit is contained in:
+33
-26
@@ -38,50 +38,48 @@ name = "Tanjunfeng"
|
|||||||
返回值:
|
返回值:
|
||||||
- int: 预测的分类标签。
|
- int: 预测的分类标签。
|
||||||
"""
|
"""
|
||||||
def normalize_data(dataSet):
|
|
||||||
"""标准化数据集使每个特征列的均值为0方差为1。"""
|
|
||||||
mean = np.mean(dataSet, axis=0)
|
|
||||||
std = np.std(dataSet, axis=0)
|
|
||||||
normalized_data = (dataSet - mean) / std
|
|
||||||
return normalized_data
|
|
||||||
|
|
||||||
# 这里写自己的代码实现
|
# 这里写自己的代码实现
|
||||||
def classify0(inX, dataSet, labels, k=3):
|
def classify0(inX, dataSet, labels, k=5):
|
||||||
"""
|
"""
|
||||||
KNN 分类算法。
|
KNN 分类算法。
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
- inX (numpy array): 输入待分类的样本。
|
- inX (numpy array): 输入待分类的样本。
|
||||||
- dataSet (numpy array): 训练数据集。
|
- dataSet (numpy array): 训练数据集。
|
||||||
- labels (list or numpy array): 训练集对应的标签。
|
- labels (list or numpy array): 训练集对应的标签。
|
||||||
- k (int): kNN 算法参数,请**自行设置默认值**,评测时仅会使用其默认值,不修改默认值将**无法通过**评测,**成绩为零**。
|
- k (int): kNN 算法参数。
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
- int: 预测的分类标签。
|
- int: 预测的分类标签。
|
||||||
"""
|
"""
|
||||||
# 对数据集进行标准化
|
# **步骤1数据归一化**
|
||||||
normalized_dataSet = normalize_data(dataSet)
|
minVals = dataSet.min(0)
|
||||||
normalized_inX = (inX - np.mean(dataSet, axis=0)) / np.std(dataSet, axis=0)
|
maxVals = dataSet.max(0)
|
||||||
|
ranges = maxVals - minVals
|
||||||
# 计算欧式距离
|
|
||||||
dataSetSize = normalized_dataSet.shape[0]
|
normDataSet = (dataSet - minVals) / ranges
|
||||||
diffMat = np.tile(normalized_inX, (dataSetSize, 1)) - normalized_dataSet
|
normInX = (inX - minVals) / ranges
|
||||||
|
|
||||||
|
# **步骤2计算欧氏距离**
|
||||||
|
diffMat = normDataSet - normInX
|
||||||
distances = np.sqrt(np.sum(diffMat ** 2, axis=1))
|
distances = np.sqrt(np.sum(diffMat ** 2, axis=1))
|
||||||
|
|
||||||
# 按距离从小到大排序
|
# **步骤3按距离排序**
|
||||||
sortedDistIndices = distances.argsort()
|
sortedDistIndices = distances.argsort()
|
||||||
|
|
||||||
# **步骤4选择距离最小的k个点进行加权投票**
|
# **步骤4选择距离最小的k个点,进行加权投票**
|
||||||
classCount = {}
|
classCount = {}
|
||||||
for i in range(k):
|
for i in range(k):
|
||||||
voteIlabel = labels[sortedDistIndices[i]]
|
voteIlabel = labels[sortedDistIndices[i]]
|
||||||
# 使用距离的倒数作为权重防止距离为0时除以零
|
# 使用距离的倒数作为权重,防止除以零
|
||||||
weight = 1 / (distances[sortedDistIndices[i]] + 1e-8)
|
weight = 1 / (distances[sortedDistIndices[i]] + 1e-8)
|
||||||
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + weight
|
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + weight
|
||||||
|
|
||||||
# 按类别票数从大到小排序
|
# **步骤5按投票结果排序**
|
||||||
sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True)
|
sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True)
|
||||||
|
|
||||||
|
# **步骤6返回权重和最高的标签**
|
||||||
return sortedClassCount[0][0]
|
return sortedClassCount[0][0]
|
||||||
|
|
||||||
|
|
||||||
@@ -102,5 +100,14 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
train_data, train_labels = load_data(train_file)
|
train_data, train_labels = load_data(train_file)
|
||||||
|
|
||||||
|
# 测试样本
|
||||||
|
test_sample = np.array([65915, 3.868359, 0.128078])
|
||||||
|
|
||||||
|
# 调用 classify0 函数进行预测
|
||||||
|
result = classify0(test_sample, train_data, train_labels)
|
||||||
|
|
||||||
|
print("预测的分类标签为:", result)
|
||||||
|
train_data, train_labels = load_data(train_file)
|
||||||
|
|
||||||
# 进行测试
|
# 进行测试
|
||||||
print(classify0([65915, 3.868359, 0.128078], train_data, train_labels))
|
print(classify0([65915, 3.868359, 0.128078], train_data, train_labels))
|
||||||
Reference in New Issue
Block a user