KNN算法实例

机器学习算法完整版见fenghaootong-github

MINST for KNN

数据集描述

数据文件train.csv和test.csv包含从零到九的手绘数字的灰度图像。

每个图像是高28个像素,宽28个像素,总共784像素,每个像素都有一个与之相关的像素值,用来表示像素的亮度,数字越高亮度越暗,这个值的范围是0-255

训练集有785列,第一列是标签是用户绘制的真实数字,剩下的列是像素值,每一行是一个数字

训练集中的每个像素列都有一个名称,如pixelx,其中x是0到783之间的整数。为了在图像上定位这个像素,假设我们已经将x分解为x = i * 28 + j,其中i和j是0到27之间的整数。然后,pixelx位于28 x 28矩阵的第i行和第j列(索引为零)。

测试数据集(test.csv)与训练集相同,只是它不包含“标签”列。

000 001 002 003 ... 026 027   
028 029 030 031 ... 054 055   
056 057 058 059 ... 082 083   
 |   |   |   |  ...  |   |    
728 729 730 731 ... 754 755   
756 757 758 759 ... 782 783   

代码如下

from sklearn import neighbors
import pandas as pd

**数据预处理 **

df = pd.read_csv('../DATA/train.csv')
labels = df.as_matrix(columns=['label'])#find lable to transform to matrix
dataset = df.drop('label', axis=1).as_matrix()#transform dataset to matrxi without drop lable 
dataset = dataset / (28.0*28.0)

**数据分为测试和验证集 **

train_len = int(len(labels.ravel()) * 0.75)
train_dataset = dataset[:train_len]
train_labels = labels[:train_len]
valid_dataset = dataset[train_len:]
valid_labels = labels[train_len:]

**模型训练 **

knn = neighbors.KNeighborsClassifier()  
#训练数据集  
knn.fit(train_dataset, train_labels.ravel())  

KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=1, n_neighbors=5, p=2,
           weights='uniform')

**模型预测 **

#预测  
predictions = [int(a) for a in knn.predict(valid_dataset)]

查看结果

sum = 0
for a, y in zip(predictions, valid_labels.ravel()):
    if a == y:
        sum = sum + 1
print ("%s of %s test values correct.\ntest accuracy: %f" % (sum, len(valid_labels.ravel()), sum / len(valid_labels.ravel())))
957 of 1050 test values correct.
test accuracy: 0.911429
好的,下面是一个简单的KNN算法实例,包括一个数据集。请注意,这个数据集只是一个示例,您可以根据自己的需求修改它。 ```python import math # 定义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, 2, 3], 'A'), ([4, 5, 6], 'B'), ([7, 8, 9], 'C'), ([10, 11, 12], 'D') ] # 测试KNN算法 print(knn(data, [1, 2, 1], 3, euclidean_distance, mode)) # 输出 A ``` 带有数据集的KNN算法实现到这里就结束了,您可以根据自己的需求修改数据集和特征向量的维度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值