generated from LufsX/Challenge-kNN
This commit is contained in:
+18
-8
@@ -38,30 +38,39 @@ name = "Tanjunfeng"
|
||||
返回值:
|
||||
- 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):
|
||||
"""
|
||||
KNN 分类算法。
|
||||
|
||||
|
||||
Args:
|
||||
- inX (numpy array): 输入待分类的样本。
|
||||
- dataSet (numpy array): 训练数据集。
|
||||
- labels (list or numpy array): 训练集对应的标签。
|
||||
- k (int): kNN 算法参数,请**自行设置默认值**,评测时仅会使用其默认值,不修改默认值将**无法通过**评测,**成绩为零**。
|
||||
|
||||
|
||||
Returns:
|
||||
- int: 预测的分类标签。
|
||||
"""
|
||||
# 对数据集进行标准化
|
||||
normalized_dataSet = normalize_data(dataSet)
|
||||
normalized_inX = (inX - np.mean(dataSet, axis=0)) / np.std(dataSet, axis=0)
|
||||
|
||||
# 计算欧式距离
|
||||
dataSetSize = dataSet.shape[0]
|
||||
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
|
||||
dataSetSize = normalized_dataSet.shape[0]
|
||||
diffMat = np.tile(normalized_inX, (dataSetSize, 1)) - normalized_dataSet
|
||||
distances = np.sqrt(np.sum(diffMat ** 2, axis=1))
|
||||
|
||||
# 按距离从小到大排序
|
||||
sortedDistIndices = distances.argsort()
|
||||
|
||||
|
||||
classCount = {}
|
||||
for i in range(k):
|
||||
voteIlabel = labels[sortedDistIndices[i]]
|
||||
@@ -71,7 +80,7 @@ def classify0(inX, dataSet, labels, k=3):
|
||||
# 按类别票数从大到小排序
|
||||
sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True)
|
||||
|
||||
return sortedClassCount[0][0]
|
||||
return sortedClassCount[0][0]
|
||||
|
||||
|
||||
def load_data(file_path):
|
||||
@@ -91,4 +100,5 @@ if __name__ == "__main__":
|
||||
|
||||
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