重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
##最小二乘法
创新互联是一家专业提供榆阳企业网站建设,专注与成都网站建设、网站设计、html5、小程序制作等业务。10年已为榆阳众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。
import numpy as np ##科学计算库
import scipy as sp ##在numpy基础上实现的部分算法库
import matplotlib.pyplot as plt ##绘图库
from scipy.optimize import leastsq ##引入最小二乘法算法
'''
设置样本数据,真实数据需要在这里处理
'''
##样本数据(Xi,Yi),需要转换成数组(列表)形式
Xi=np.array([6.19,2.51,7.29,7.01,5.7,2.66,3.98,2.5,9.1,4.2])
Yi=np.array([5.25,2.83,6.41,6.71,5.1,4.23,5.05,1.98,10.5,6.3])
'''
设定拟合函数和偏差函数
函数的形状确定过程:
1.先画样本图像
2.根据样本图像大致形状确定函数形式(直线、抛物线、正弦余弦等)
'''
##需要拟合的函数func :指定函数的形状
def func(p,x):
k,b=p
return k*x+b
##偏差函数:x,y都是列表:这里的x,y更上面的Xi,Yi中是一一对应的
def error(p,x,y):
return func(p,x)-y
'''
主要部分:附带部分说明
1.leastsq函数的返回值tuple,第一个元素是求解结果,第二个是求解的代价值(个人理解)
2.官网的原话(第二个值):Value of the cost function at the solution
3.实例:Para=(array([ 0.61349535, 1.79409255]), 3)
4.返回值元组中第一个值的数量跟需要求解的参数的数量一致
'''
#k,b的初始值,可以任意设定,经过几次试验,发现p0的值会影响cost的值:Para[1]
p0=[1,20]
#把error函数中除了p0以外的参数打包到args中(使用要求)
Para=leastsq(error,p0,args=(Xi,Yi))
#读取结果
k,b=Para[0]
print("k=",k,"b=",b)
print("cost:"+str(Para[1]))
print("求解的拟合直线为:")
print("y="+str(round(k,2))+"x+"+str(round(b,2)))
'''
绘图,看拟合效果.
matplotlib默认不支持中文,label设置中文的话需要另行设置
如果报错,改成英文就可以
'''
#画样本点
plt.figure(figsize=(8,6)) ##指定图像比例: 8:6
plt.scatter(Xi,Yi,color="green",label="样本数据",linewidth=2)
#画拟合直线
x=np.linspace(0,12,100) ##在0-15直接画100个连续点
y=k*x+b ##函数式
plt.plot(x,y,color="red",label="拟合直线",linewidth=2)
plt.legend(loc='lower right') #绘制图例
plt.show()
首先我们要知道ℎ????(????(????))等于什么,它的意思是θ^T乘以X,X是一个向量,如果用等式表达的话就是 θ0????0 + θ1????1 + θ2????2+...+θ???????????? ,当然θ也是一个向量,而且是一维的,python里面有一个库叫numpy,专门做矩阵运算的,我们使用就可以了,我们先初始化X,y,还有θ吧
先随机初始化,这些东西应该不需要讲,randint是随机整数,rand是小数,然后low参数代表你的随机数上界,size就是维度,初始化完成后就开始运算。
求和公式里面的运算
( (h(θ) = X theta^T) - y )^2*
我想这些应该不难,就是(X * theta.T - y),平方的话用np的power()函数。
inner = np.power((X * theta.T - y),2),第二个参数就是平方数
然后我们就可以计算求和公式外面的了,这个m代表着X矩阵的行数,对应的就是X的
向量个数,
np.sum(inner,axis=None)
最后再除以两倍的x向量个数即可,就是1 / len(X) * 2为什么是两倍呢,因为它求了偏导数,所以就是2了,好了,把它们整理一下写成函数吧
raw_input获取的输入是字符串,不能直接用np.array,需要用split进行切分,然后强制转化成数值类型,才能用plot函数
我把你的代码稍微修改了一下,可能不太漂亮,不过能运行了
x=[1,2,3]
a = raw_input('function')
a = a.split(' ')#依空格对字符串a进行切分,如果是用逗号分隔,则改成a.split(',')
b = []
for i in range(len(a)):#把切分好的字符强制转化成int类型,如果是小数,将int改为float
b.append(int(a[i]))
plt.plot(x, b, label='x', color="green", linewidth=1)