knn算法,最优k值求解
需求测试knn算法精度,并选出精度最高的k值
文件如下:在test、和train文件夹里分别有如下文件,文件名_左侧是每个txt文件里1组成的数字,每个txt文件都是32行、32列共计1024个字符
用train里面的文件进行训练,用test里面的文件进行测试
读取文件中的字符,并保存至excel
import os
import numpy as np
import pandas as pd
import timedef transform_data(file_path):#1. 获取训练集的全部文件名称train_file_name = os.listdir(file_path)print(train_file_name)file_arr_list = []for file_name in train_file_name:#2. 拼接完整路径file_full_path = os.path.join(file_path,file_name )print(file_full_path)# 3.逐一读取文件:train_data = pd.read_csv(file_full_path, header=None, engine='python',encoding='gbk').valuesprint(train_data) # shape(32,1)#4.横向展平:train_arr = train_data.ravel()train_list = list(''.join(train_arr))#5. 标签:label = file_name.split('_')[0]train_list.append(label)#4. 存入到list中, 元素类型转为int:file_arr_list.append(train_list) #[[一个样本完整数据]]#5. 转为df类型:name = file_path.split('\\')[-1]train_df = pd.DataFrame(data=file_arr_list)train_df.to_excel(f'{name}.xlsx')if __name__ == '__main__':#1.获取所有训练集:train_path = r'E:\KNN_手写数字识别\digits\trainingDigits'test_path=r'E:\KNN_手写数字识别\digits\testDigits'transform_data(train_path)transform_data(test_path)
手写算法方法
import pandas as pd
import numpy as np# 1.读取训练集与测试集:
train = pd.read_excel('trainingDigits.xlsx')
test = pd.read_excel('testDigits.xlsx')# 2. knn算法:def Knn(k):test_predict_list = []for sample_index in range(test.shape[0]):# (1)获取测试样本:sample = test.iloc[sample_index, :-1] # (1024, )real_label = test.iloc[sample_index, -1]# (2)计算相似度:distance = np.sqrt(((train.iloc[:, :1024] - sample) ** 2).sum(axis=1)) # distance 这里不要用-1,因为下边增加列,就会变# (3)将距离插入train中:train.loc[:, 'distance'] = distance # train(行, 1026) 此时多了一列# (4) 排序:train.sort_values(by='distance', inplace=True)predict_label = train.head(k).loc[:, 1024].mode().values[0]print('预测结果:\n', predict_label)print('真实结果:\n', real_label)test_predict_list.append(predict_label)# (5)predict1 = pd.Series(test_predict_list)real1 = test.loc[:, 1024]# 精度precision = (predict1 == real1).sum() / real1.sizeprint(precision)return precisionprecision_list = []
if __name__ == '__main__':for k in range(2, 100, 10):precision = Knn(k)precision_list.append(precision)print(precision_list)
knn模块算法
import pandas as pd
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score#1.读取训练集与测试集:,index_col=0将第0列当做行索引: (1954, 1026)
train = pd.read_excel('trainingDigits.xlsx', index_col=0)
test = pd.read_excel('testDigits.xlsx')#==================================手动分割训练集与测试集,完成训练与测试的=======================================
#2.实例化:n_neighbors; k
knn = KNeighborsClassifier(n_neighbors=10)#3.训练模型:利用训练集训练模型,训练集中应该包含x, y
x_train = train.iloc[:, :1024]
y_train = train.loc[:, 1024]
knn.fit(x_train, y_train)#4. 将测试集输入进行预测:
x_test = test.iloc[:, :1024]
y_test = test.iloc[:, 1024]
print(x_test.shape)y_predict = knn.predict(x_test)
print('真实结果:\n', y_test)#5. 求精度的方法:
print(knn.score(x_test, y_test))
交叉验证方法
#====================交叉验证,无需手动分割样本======================================
# 1.拿到所有样本:
concat_data = pd.concat((train, test), axis=0)
print(concat_data.shape)#2. 模型:
knn = KNeighborsClassifier(n_neighbors=5)#2. 提取样本中的特征与标签:
x = concat_data.iloc[:, :1024]
y = concat_data.loc[:, 1024]
#3. 交叉验证, 返回每次的模型精度;
score = cross_val_score(knn, x, y, cv=10)
print(score)
print(score.mean())
网格搜索方法
#===========================选择参数:网格搜索=========================from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier#(1) 实例化模型:
knn = KNeighborsClassifier()#(2)网格搜索模型初始化:
# 定义模型的参数候选集:
params = {'n_neighbors':[2, 3, 4, 5, 6, 7, 8]}gridcv = GridSearchCV(knn, param_grid=params, cv=10)#(3) 评估模型精度:
# a.拿到所有样本:
concat_data = pd.concat((train, test), axis=0)# b. 提取样本中的特征与标签:
x = concat_data.iloc[:, :1024]
y = concat_data.loc[:, 1024]gridcv.fit(x,y)print('返回精度最高对应的参数:\n', gridcv.best_params_)
print('返回模型的最高精度值:\n', gridcv.best_score_)
knn算法,最优k值求解相关推荐
- knn算法的最佳k值_KNN(k-NearestNeighbor)算法笔记
本博文主要参考来源: 忆臻:一文搞懂k近邻(k-NN)算法(一)zhuanlan.zhihu.com 一.KNN算法的核心思想: 算法的核心思想是,即是给定一个训练数据集,对新的输入实例,在训练数据 ...
- 通过交叉验证寻找K近邻算法的最优K值
问题引出 之前我们使用K近邻算法尝试寻找用户年龄与预估薪资之间的某种相关性,以及他们是否有购买SUV的决定.主要代码如下: from sklearn.neighbors import KNeighbo ...
- KNN和K-means的区别 为什么KNN算法里的K越小模型会越复杂? 过拟合和欠拟合的偏差和方差问题
这里将这三个问题在一起讲,仅仅是因为自己觉得有些联系,而且正好自己概念有些模糊. 1. KNN 和 K-means的区别:参考https://www.cnblogs.com/nucdy/p/63491 ...
- 肘方法确定聚类数k_一种自动识别肘部法则中最优K值的方法与流程
本发明涉及一种自动识别肘部法则中最优K值的方法,特别涉及一种结合利用机器学习中无监督学习中常用的K-Means聚类算法.肘部法则以及通过0-10的规则化对平均畸变程度进行规则化.将0-10规则化后的平 ...
- KNN分类器、最近邻分类、KD树、KNN分类的最佳K值、基于半径的最近邻分类器、KNN多分类、KNN多标签分类、KNN多输出分类、KNN分类的优缺点
KNN分类器.最近邻分类.KD树.KNN分类的最佳K值.基于半径的最近邻分类器.KNN多分类.KNN多标签分类.KNN多输出分类.KNN分类的优缺点 目录
- K-means聚类最优k值的选取
最近做了一个数据挖掘的项目,挖掘过程中用到了K-means聚类方法,但是由于根据行业经验确定的聚类数过多并且并不一定是我们获取到数据的真实聚类数,所以,我们希望能从数据自身出发去确定真实的聚类数,也就 ...
- 【转】K-means聚类最优k值的选取
以下博文转自:https://blog.csdn.net/qq_15738501/article/details/79036255 感谢 最近做了一个数据挖掘的项目,挖掘过程中用到了K-means聚 ...
- R语言Kmeans聚类、抽取聚类簇:fpc包的kmeansruns函数通过Calinski-Harabasz准则和平均轮廓系数(ASW)为Kmeans选择最优的聚类K值、并与层次聚类的最优K值进行比较
R语言Kmeans聚类.抽取Kmeans聚类找到的聚类簇:fpc包的kmeansruns函数通过Calinski-Harabasz准则和平均轮廓系数(Average average silhouett ...
- R语言Kmeans聚类、抽取聚类簇:fpc包clusterboot函数通过bootstrap重采样的方法评估Kmeans聚类的稳定性、fpc包的kmeansruns函数通过CH准则和ASW获取最优K值
R语言Kmeans聚类.抽取聚类簇:fpc包的clusterboot函数通过bootstrap重采样的方法评估Kmeans聚类的稳定性.fpc包的kmeansruns函数通过Calinski-Hara ...
最新文章
- Spring Cloud Feign设计原理
- android html邮件 messagecompose,android email 转发附件丢失问题
- java 异步_聊聊java高并发系统之异步非阻塞
- java 反射 调用私有构造函数_使用反射调用私有方法
- pos mac java_有没有谁搞过银联POS终端mac算法[php版本]?
- Nginx 学习笔记(《深入理解Nginx:模块开发与架构解析》读书笔记)
- 网页游戏开发秘笈 PDF扫描版
- [Python3学习笔记-入门到入魔系列] 5分钟彻底搞懂XML文档解析
- h5-video3 解决html5 audio iphone,ipd,safari不能自动播放问题
- python练习题003:圆的面积
- NoSQLBooster for MongoDB软件使用
- python使用python-docx自动化操作word
- 代码实现对麻将的听牌分析(判断什么牌能胡)
- 合肥工业大学计算机学院加减分,合肥工业大学奖学金加减分细则(定稿修改)
- VMD确定分解个数K(matlab)
- cython,加速python,保护代码(3):扩展文件 .pxd
- 解决MYSQL 8小时连接问题
- 高中地理模板_(完整版)高中地理万能答题模板.doc
- Hibernate之FormatStyle SQL格式化
- 郑州晚报百特联到尖山采摘“密二花”
热门文章
- 对代换置换网络算法中Nr和Nr+1轮的理解
- 如何生成项目的json静态文件
- 通过新浪股票接口 实现 Echarts K线图
- vim c语言编辑器,Vim编辑器简单使用
- 哪种ARM Cortex内核更适合我的应用:A系列、R系列、还是M系列?
- 心脏滴血漏洞详解及利用--HeartBleed With OpenSSL
- 讯鸟建中国首个政府云计算平台
- error reconnecting to master ‘userName@192.168.1.88:3306‘ - retry-time: 60 maximum-retries: 86400
- 【蓝桥杯单片机芯片STC15F2K60S2 / IAP15F61S2 转51/52直插式 转接板PCB】
- DNS地址解析的设置