KNN算法代码实现底层

import numpy as np 
import matplotlib.pyplot as plt  # 画图用
import math

# 这是训练集
train_x = [[3.3935, 2.3312],
           [3.1100, 1.7815],
           [1.3438, 3.3686],
           [3.5822, 4.6791],
           [2.2803, 2.8669],
           [7.4234, 4.6965],
           [5.7450, 3.5339],
           [9.1721, 2.5111],
           [7.7927, 3.4240],
           [7.9398, 0.7916]]

# 结果集
train_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]

# 在这里将数据集转化为numpy类型的
trainx = np.array(train_x)
trainy = np.array(train_y)
# x 为测试的点的位置
x = np.array([8.0936, 3.3657])

# 将属于不同类的点画出
plt.figure(figsize=(10, 6))  # figsize是画布的大小
plt.scatter(trainx[trainy == 0, 0], trainx[trainy == 0, 1])
plt.scatter(trainx[trainy == 1, 0], trainx[trainy == 1, 1])
plt.scatter(x[0], x[1])  # 将要测试的点也画出来
# plt.show()

# 计算出测试点到各个点之间的距离
# 这里计算距离用的是 欧氏距离
distances = []
for x_train in trainx:
    d = math.sqrt(np.sum((x_train - x)**2))
    distances.append(d)
print(distances)

# distances.sort()
# 将存放距离的列表进行排序, 这里用numpy下的argsort进行排序。返回的是: 下标
argsort = np.argsort(distances)
print(argsort)

# 定义K的值
k = 6

# 把距离测试点最近的k个点取出
topK_y = [trainy[i] for i in argsort[:k]]
print(topK_y)

# Counter用来计数
from collections import Counter
# Counter是对topK_y中的0, 1进行计数,返回的是 字典
votes = Counter(topK_y)

# 将字典中最多的这一组取出并取出它所属类
x_lei = votes.most_common(1)[0][0]

print(x_lei)

输出结果:

[4.81260119478022, 5.22933634412628, 6.749800622981393, 4.698696576711461, 5.834660086928801, 1.4900324425998253, 2.354615297665417, 1.3760462964595341, 0.3064958401022765, 2.578690607653427]

[8 7 5 6 9 3 0 1 4 2]

[1, 1, 1, 1, 1, 0]

Counter({1: 5, 0: 1})

1

K近邻是机器学习中及其简单的一种算法。思想也是非常简单。很少用数学公式。K近邻思想看上一篇
机器学习K近邻算法

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
KNN算法是一种经典的机器学习算法,用于分类和回归问题。在C语言中,我们可以通过数组和循环来实现KNN算法。 下面是一个简单的KNN算法的C语言代码实现: ```c #include <stdio.h> #include <math.h> #define K 3 // 设置K值为3 #define N 5 // 设置训练样本数量为5 #define M 2 // 设置测试样本数量为2 #define DIMENSION 2 // 设置样本维度为2 // 计算欧氏距离 float calculateDistance(float* sample1, float* sample2) { float sum = 0.0; for (int i = 0; i < DIMENSION; i++) { sum += pow(sample1[i] - sample2[i], 2); } return sqrt(sum); } // 寻找最近的K个样本 int findNearestNeighbors(float** trainSamples, float* testSample, int* labels) { float distances[N]; // 存储每个训练样本到测试样本的距离 int neighbors[K]; // 存储最近的K个样本的索引 // 初始化距离和最近样本的索引 for (int i = 0; i < N; i++) { distances[i] = calculateDistance(trainSamples[i], testSample); neighbors[i] = i; } // 对距离进行从小到大排序 for (int i = 0; i < N; i++) { for (int j = 0; j < N - i - 1; j++) { if (distances[j] > distances[j + 1]) { float tempDist = distances[j]; distances[j] = distances[j + 1]; distances[j + 1] = tempDist; int tempIdx = neighbors[j]; neighbors[j] = neighbors[j + 1]; neighbors[j + 1] = tempIdx; } } } // 统计K个样本中最多的类别 int classCount = 0; int maxCount = 0; for (int i = 0; i < K; i++) { int label = labels[neighbors[i]]; int count = 0; for (int j = 0; j < K; j++) { if (labels[neighbors[j]] == label) { count++; } } if (count > maxCount) { maxCount = count; classCount = label; } } return classCount; } int main() { float trainSamples[N][DIMENSION] = {{1.0, 1.0}, {2.0, 2.0}, {3.0, 3.0}, {4.0, 4.0}, {5.0, 5.0}}; float testSamples[M][DIMENSION] = {{2.5, 2.5}, {4.5, 4.5}}; int labels[N] = {0, 0, 1, 1, 1}; for (int i = 0; i < M; i++) { int result = findNearestNeighbors(trainSamples, testSamples[i], labels); printf("Test Sample %d belongs to Class %d\n", i, result); } return 0; } ``` 该代码实现了一个简单的KNN算法,其中训练样本、测试样本和对应的类别标记以及K值都是在代码中事先定义好的。通过调用`findNearestNeighbors`函数,对于每个测试样本,算法会找到最近的K个训练样本,然后通过统计K个样本中出现次数最多的类别来进行分类预测。 以上就是KNN算法的C语言代码实现。注意,这只是一个简单的示例代码,实际应用时可能需要考虑更多的算法细节和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值