用矩阵来处理数据—降维打击

南楼画角 提交于 2020-11-22 21:03:06

“同四维跌落到三维一样,三维空间也会向二维空间跌落,由一个维度蜷缩到微观中。那一小片二维空间的面积——它只有面积——会迅速扩大,这又引发了更大规模的跌落……我们现在就处在向二维跌落的空间中,最终,整个太阳系将跌落到二维,也就是说,太阳系将变成一副厚度为零的画。”



01


维度


上面引用了三体的一段话,探讨一下维度的事情。处理数据的时候,我们是习惯了将相同的性质的数据分门别类。有个很有意思的事情,既然大部分人认为四维是指时间,那么为什么不能说每一种分类方式就是一个维度。


举个例子:注册规划师考四门,那就好比四个维度,有一百个注册规划师组成的列队,按他们原理、相关、法规、实务的分数进行排名,那就是四组数据;四组数据只能形成100行4列的二维矩阵;假设加上注册建筑师、注册结构师、注册暖通等等,又可以整理成一个三维矩阵;再按士、农、工、商等去区分,升级成一个四维矩阵。


因为有太多的数据在我们面前,还有一句话叫“选择大于努力”。最近的研究项里其实就是要在大量数据中找到最理想的那组数据,因此我写了不少代码,在数据的运算过程中又发现,如果要在合理的时间内做出计算,那还得提高计算的速度,那就得用到numba、cpython等。




02

数据扩充


选址大于努力的话,其实很多时候就是在做排列组合题。之前听东吴相对论里头有讲到,如果生活中有太多的事情压积在一起,那就先列举100件,载从中选20件,最终挑出最重要的五件事情开始做。


上面是讲现实生活中的例子,主要是想解释我之前是怎样写又长又复杂的代码,通过几个简单的python的模块让代码变得简单。


# 从十个数中选五个数的结果x5 = []for a in range (1,11):    for b in range(a+1,11):        for c in range(b + 1, 11):            for d in range(c + 1, 11):                for e in range(d + 1, 11):                    x5.append([a,b,c,d,e])

最开始从十个数选五个数大概要写7行代码

import itertoolsc10 = [123456789,10]c105 = itertools.combinations(c10, 5))

加上引用模块共3行。



03

蝴蝶效应


电影《蝴蝶效应》里面,男主因为一个决定,导致了整个人生都不一样,每个人只拥有一个人生,当然平行宇宙我也是相信的。数据的处理就不一样了,可以将所有可能性都模拟出来。


前面讲了组合,接下来要讲排列的事情,就拿先苦后甜,先甜后苦;或者是有一块五花肉,先吃瘦的部分再吃肥的,还是相反那就是不同的排列。


排列的代码也是第二部分用到的模块:

import itertools# 八个数的全排列可能arr = [0, 1, 2, 3, 4, 5, 6, 7]pailie = list(itertools.permutations(arr))




04

降维分析


前面的排列组合作为扩充数据的方式,那接下来具体应用一下,就拿一到十十个数按第一名到十名随机生成数字,每个数字要有一次,这样去生成一个8行10列的矩阵数据。这是原始矩阵,如果按8期每次去选0到7的数去跟它相加并取除10的余数,那就能生成一个40320个与原始矩阵的三维矩阵。


import itertoolsimport numpy as npimport numba as nb
ysj=[[9,8,4,6,1,7,3,2,10,5],[8,7,9,1,4,3,6,10,2,5],[1,8,2,9,7,6,10,3,4,5],[10,8,1,5,4,7,2,3,9,6],[5,10,1,3,4,7,2,9,6,8],[8,2,6,1,4,9,10,7,5,3],[10,5,8,4,3,7,9,1,2,6],[9,5,6,8,7,10,1,4,3,2]]
arr = [0, 1, 2, 3, 4, 5, 6, 7]pailie = list(itertools.permutations(arr))
mmm = np.array(ysj)nn = mmm.reshape(8, 10).Tnnn = np.repeat(nn, 40320, axis=0)
d=np.array(pailie)jjj = d.reshape(40320, 8)kkk = jjj.tolist() * 10lll = np.array(kkk)
ff = (lll + nnn) % 10
@nb.jit()def func(x): z=len(set(x)) return z

jg = np.apply_along_axis(func, 1, ff)


降维分析可以写成一个函数,利用np.apply_along_axis完成所有矩阵的某根轴的计算。@nb.jit()进行加速。


这样加大了数据量,也能进行单个数列的运算,最有最劣的可能都能列举出来。







后台回复关键词:教育,可查看我的个人在线课程,欢迎大家来沟通、交流、共同学习!


往期回顾


将地理范围网格化以及高德Loca API使用

坐标纠偏与格式转换工具

找份钱多活少离家近的工作







本文分享自微信公众号 - 玩大数据的规划师(paitashuju)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!