第十八天学习进度--计算机语言函数提取算法

前几天在写曲线函数的拟合,参照前几天的编写过程与思路,今天突然有了一个大胆的想法,既然普通的函数能够通过一堆数列来推断出原来数列的公式,那么如果是计算机的函数呢,是否能通过提供几个原本传递过去的参数还有他们对应的最终结果,最终得到一个传递函数转化为最终结果的这样一个函数。

比如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]]))

 

 

 可以看到,函数的排序输出结果完全正确,所以我们通过数据与结果,得到了排序的这个计算机函数

 

posted on 2020-07-27 20:07  Halone  阅读(273)  评论(0编辑  收藏  举报