第十八天学习进度--计算机语言函数提取算法
前几天在写曲线函数的拟合,参照前几天的编写过程与思路,今天突然有了一个大胆的想法,既然普通的函数能够通过一堆数列来推断出原来数列的公式,那么如果是计算机的函数呢,是否能通过提供几个原本传递过去的参数还有他们对应的最终结果,最终得到一个传递函数转化为最终结果的这样一个函数。
比如X,Y,Z是传递过去给计算机函数的参数,已知这些参数经过某个过程处理之后得到结果A,B,C
现在提供多个X,Y,Z和A,B,C的对应关系 ,若能得到 F(X,Y,Z)-->A,B,C的映射的话,那么传递过去任何数,都会经过F(X,Y,Z)-->A,B,C的处理
通俗点讲就是提供多个原始数据和最终数据,然后分析得到从原始数据转换到最终数据的函数
比如提供多个随机打乱的数组
[[3,2,1],[2,3,4],[1,3,2],[4,3,6],[9,5,6],[9,3,5]]
然后再提供与之对应的排序好的数组
[[1,2,3],[2,3,4],[1,2,3],[3,4,6],[5,6,9],[3,5,9]]
通过提供的原始数据和最终数据,可以得到 从小到大排序这样一个函数
有了上述的思路之后,我们开始我们的编程过程。
在python中,sklearn已经为我们提供了对应的多元线性的函数拟合方法(但是sklearn中的多元线性拟合的最小二乘法和梯度下降具有局限性,只有实现多元非线性拟合的时候,才能达到真正的函数拟合)
因此我们可以直接调用对应的方法来找到对应的关系
#!/usr/bin/env python # -*- coding:utf-8 -*- #@Time : 2020/7/25 16:01 #@Author: hdq #@File : funcgetter.py #1 结果反推结果规律 #2 长度为参数 #第一步,长度+内值 若全相同 规律寻找,不相同,函数对应(简单情况) #3 相关参数寻找(预:归类算法,属于长度不一的) #3.1 (相对位置,值) #长,a,b,c,d(,e) 输出数组长 #计算时的位置是相对位置 #先将问题简化 #如果输入大小是固定大小 #多关系递归 import collections from sklearn import linear_model #取数组第N位 def point_num(numlist,point): return sorted(numlist)[point] #取列表中最接近的数 def get_near(numlist,nearnum): mlist=[] for one in numlist: mlist.append(abs(one-nearnum)) minnum=min(mlist) for one in numlist: if(abs(one-nearnum)==minnum): return one return 0 # #获得最根本关系列表,relation是二数间进行的操作 # def get_root(numlist,relation): #获得n个列表中相同的元素 def extra_same_elem(lsts): iset = set(lsts[0]) for li in lsts[1:]: s = set(li) iset = iset.intersection(s) return list(iset) #判断%n的元素相同 def same(numlist,percent=100): trie = collections.defaultdict(set) for one in numlist: trie[one].add(one) maxpercent=0 numlen=len(numlist) for one in set(numlist): nowpercent=len(trie[one])/numlen if(nowpercent>maxpercent): maxpercent=nowpercent if(maxpercent>=percent): return True return False #函数提取 def func_create(xlist,ylist): model = linear_model.LinearRegression() model.fit(xlist, ylist) return model #函数生成 inxlist:结果数据是否完全在原数据里面
def func_general(model,xlist,inxlist=True):
numlist=[]
for i,one in enumerate(model.predict(xlist)):
result=[]
try:
for two in one:
if inxlist:
info=get_near(xlist[i],two)
else:
info=two
result.append(info)
numlist.append(result)
except:
numlist.append(one)
return numlist
然后通过输入上面的数据,来得到一个计算机的函数,排序算法
model=func_create([[3,2,1],[2,3,4],[1,3,2],[4,3,6],[9,5,6],[9,3,5]],
[[1,2,3],[2,3,4],[1,2,3],[3,4,6],[5,6,9],[3,5,9]])
通过上面的数据,我们已经得到一个排序函数的模型,下面我们输入任意数,让其进行排序,来测试排序功能
print(func_general(model,[[4,3,2],[7,3,9],[5,4,1]]))
可以看到,函数的排序输出结果完全正确,所以我们通过数据与结果,得到了排序的这个计算机函数