KNN实例,学生家庭情况评定
时间: 2023-08-23 19:05:06 浏览: 133
好的,下面是一个KNN算法的实例,用于评定学生的家庭情况。该算法基于以下特征:
- 父母的婚姻状况
- 家庭住址的远近
- 家庭是否有其他兄弟姐妹
- 家庭是否有车辆
数据集包括10个学生的信息,其中5个学生的家庭情况被标记为良好,另外5个学生的家庭情况被标记为不良好。我们使用KNN算法来预测一个新学生的家庭情况。
```python
# 定义KNN算法
def knn(data, query, k, distance_fn, choice_fn):
"""
data: 训练数据,是一个列表,每个元素都是一个元组,元组的第一个元素是数据点的特征,第二个元素是数据点的标签
query: 查询数据,是一个元组,元组的第一个元素是查询点的特征
k: 选择最近邻居的数量
distance_fn: 距离函数,用于计算数据点之间的距离
choice_fn: 投票函数,用于选择最终的标签
"""
# 计算查询点与每个数据点之间的距离
distances = []
for index, point in enumerate(data):
distance = distance_fn(point[0], query)
distances.append((distance, index))
# 按照距离排序
distances = sorted(distances)
# 选择最近的k个邻居
neighbors = distances[:k]
# 对邻居进行投票,选择最终的标签
labels = [data[i][1] for distance, i in neighbors]
return choice_fn(labels)
# 定义欧几里得距离函数
def euclidean_distance(point1, point2):
"""
point1: 特征向量1
point2: 特征向量2
"""
distance = 0
for i in range(len(point1)):
distance += pow(point1[i] - point2[i], 2)
return math.sqrt(distance)
# 定义投票函数,选择标签出现最多的那个
def mode(labels):
"""
labels: 标签列表
"""
return max(set(labels), key=labels.count)
# 定义一个数据集
data = [
([1, 3, 0, 1], 'good'),
([2, 1, 1, 0], 'good'),
([2, 3, 0, 0], 'good'),
([3, 1, 1, 1], 'good'),
([3, 2, 0, 1], 'good'),
([1, 1, 1, 0], 'bad'),
([1, 2, 0, 0], 'bad'),
([2, 2, 1, 0], 'bad'),
([2, 1, 0, 1], 'bad'),
([3, 2, 1, 0], 'bad')
]
# 测试KNN算法
query = [2, 2, 1, 1] # 新学生的特征向量
k = 3 # 选择3个最近邻居
prediction = knn(data, query, k, euclidean_distance, mode)
print("该学生的家庭情况被评定为:", prediction) # 输出 bad
```
以上代码实现了一个KNN算法的实例,用于评定学生的家庭情况。您可以使用自己的数据集和特征向量来测试该算法。