【代码学习笔记】用KNN算法改进约会网站的配对效果——1(读入数据)

《机器学习实战》——P21,用KNN算法改进约会网站的配对效果

在把数据放进算法训练前,需要先从数据集/txt文本等地方读入数据。

今天这篇文章尝试进行读入数据


解析数据


1.在读入数据之前,要先知道数据存放的结构。是一行数据代表一个数据样本?还是一列数据代表一个数据样本?这首先要弄清楚。不过通常是一行数据代表一个数据样本。

2.假设是一行数据代表一个样本,那么这行数据里面每个元素是data特征之一还是label

以下就是读取数据的常规操作,用代码展示:

with open("数据路径") as inline:
	for line in inline:
		元素1, 元素2..... 等等 = line.split('分隔符')


数据格式化,把数据放入列表/元组


3.读取数据之后通常会把数据放进list"[元素1,元素2,…]" 或者tuple"(元素1,元素2,…)"

然后假设:
第1条数据所有元素放进list1[元素1,元素2…]
第2条数据所有元素放进list2[元素1,元素2…]

第N条数据所有元素放进listN[元素1,元素2…]


这N条数据的list放进一个大的list里面,组成:
list[list1, list2, …, listN]


最后再对这个list进行输出,输出给一个变量,就可以完成对数据读入的处理。


用代码展示:

list = []
with open("数据路径") as inline:
	for line in inline:
		元素1, 元素2.....等等  = line.split('分隔符')
		
		#进行的新的操作
		list.append([元素1, 元素2.....等等])
		#第一次进行之后list会变成[[元素1, 元素2, .....等等],]
	
	#所有for循环进行完成后list会变成
	#[[元素1, 元素2, .....等等],
	# [元素1, 元素2, .....等等],
	# ...n个
	# [元素1, 元素2, .....等等]]

return list


演示例子


这里有datingTestSet2.txt数据集,展示部分数据

datingTestSet2.txt数据集,以及《机器学习实战》书本代码以及其他数据都可以在下面的链接下载:

https://www.manning.com/downloads/1108

本文数据集在 “Ch02\datingTestSet2.txt” 目录下

datingTestSet2.txt:

40920 8.326976 0.953952 3
14488 7.153469 1.673904 2
26052 1.441871 0.805124 1
75136 13.147394 0.428964 1
38344 1.669788 0.134296 1

以上是datingTestSet2.txt的部分数据
每两列数据之间都用 "\t" —— 制表符 分隔

格式化后
特征1特征2特征3label
409208.3269760.9539523
144887.1534691.6739042
260521.4418710.8051241
7513613.1473940.4289641
383441.6697880.1342961

前三列为特征,最后一列label,是表示分类的标签


用代码展示:
1.用file_path找到txt数据文件
2.再用with… open…打开,取得所有行数据——inline
3.用for循环读取 inline每行数据 —— line ,并且计数循环了多少次——用于表示数据数量
4.用split函数分割 line——每行数据 赋值给 变量
5.打包 变量 中的 特征变量 成为一个 list,给 变量 data_list
同时
6.打包 变量 中的 label变量 成为一个 list,给 变量 label_list

def file2Matrix(file_path):
	data_list = []
	label_list = []
	count = 0
	
	with open(file_path) as inline:
		for line in inline:
			#strip(),用于移除字符串头尾指定的字符
			#可移除末尾的"\n"换行符
			line = line.strip()
			#分割之后a1,a2,a3都是string类型
			#所以要转换成float,再放进列表
			#不然到后面运算错误
			a1, a2, a3, label = line.split("\t")
			data_list.append([a1 ,a2 ,a3])
			#data_list.append([float(a1) ,float(a2) ,float(a3)])
			label_list.append(label)
			
			count += 1
	return count, data_list, label_list		

测试

测试代码

count, data_list, label_list = file2Matrix("C:\\Users\\hello\\Desktop\\MLBook\\Ch02\\datingTestSet2.txt")
print(array(data))
print(array(label))
print(count)

测试结果:
在这里插入图片描述

data_list 与 label_list的展示

count:1000,符合预期读入的数据数量

到后面输入KNN算法函数进行测试出现:

Traceback (most recent call last):
  File "C:/Users/hello/PycharmProjects/pythonProject/KNNinPage19.py", line 130, in <module>
    classs = classfly0(a,data_list_np,label_list_np,10)
  File "C:/Users/hello/PycharmProjects/pythonProject/KNNinPage19.py", line 19, in classfly0
    diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32')

原因是因为split之后特征data都是string类型,需要转换成float/int

a1, a2, a3, label = line.split("\t")
#错误
#data_list.append([a1 ,a2 ,a3])
#正确
data_list.append([float(a1), float(a2), float(a3)])
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值