什么是最小二乘法?
① 最小二乘法的本质上就是:在观测到一系列 {xi, yi} 的情况下去推测 {w, b} 的最靠谱的取值
② 例如,面临一个现实中的任务,需要设计一个线性模型 y=wx+b,然后根据 x 来估算 y 值。
- 先要测量一组 { x, y} 的数值。
- 根据这些测量出来的 { x, y } 来求解一个线性模型 y=wx+b 中的参数 w 和 b。
注:似乎我们只要有两对 { x, y } 的取值就可以求解出线性方程组得到 w 和 b 的取值。
注:这个思路是不对的,测量出来的 {xi, yi} 并不完全符合 y=wx+b 这个线性关系。
③ 例如,有五把尺子:
![fe994a930ac8af92e7fd724608ac725e.png](https://i-blog.csdnimg.cn/blog_migrate/ac5756935f5dc0003c54411a015d3335.jpeg)
④ 用它们来分别测量一线段的长度,得到的数值为:
![85aa02bb1b5c203f5ea2a0c131a047c0.png](https://i-blog.csdnimg.cn/blog_migrate/14ccbf2df3490903aa83f3eb84cd7289.png)
⑤ 之所以出现不同的值可能因为:
- 不同厂家的尺子的生产精度不同
- 尺子材质不同,热胀冷缩不一样
- 测量的时候心情起伏不定
- ......
由上图,可以看出,每把尺子测量的情况是不一样的。
注:这种情况下,一般取平均值来作为线段的长度。
⑥ 也就是说:
- 每个人都想这个世界是真实的,但是实际上是非真实的。
- 于是我们努力做出一个 ≈ 真实的,它只需要近似尽可能满足各个条件达到方差最小。
注:方差代表着各个数据分别与其平均数之差的平方的和的平均数。
注:方差即代表着数据偏离程度。
⑦ 我们测量出的 ( xi, yi ) 实际所符合的模型其实是这样的:
![f7cb9b919eaa3a0ac450ed88e1e6b867.png](https://i-blog.csdnimg.cn/blog_migrate/05fd6acf2f28356ed522f9e9299abe8e.png)
注:其中
注:在无法彻底消除误差的情况下,我们永远都不能得到完全精确的 w 和 b 的取值。
注:幸运的是,我们可以根据 "概率论" 去 "推测" 一个比较有可能的 w 和 b 的取值。
⑧ 假设
注:我们先得将不确定的量
注:由于
注:参考文献:1. 什么是高斯分布? 2. 什么是中心极限定理?
⑨ 这里我们采用最大似然估计,综合所有的观测值 {xi, yi} 的概率,可得模型的参数 {w, b}
![eaa478561486fb4730c0b722d38f66a0.png](https://i-blog.csdnimg.cn/blog_migrate/ab398cd315e9e17e4b8d004c349281db.png)
![9ec8a0041463f0251787f5af4b4fb959.png](https://i-blog.csdnimg.cn/blog_migrate/36f139667e2d478afa0b5885506bf770.jpeg)
注:参考文献:1. 什么是最大似然估计?
注:在测量误差
⑩ 最小二乘法就是要找到一组模型参数
注:高斯于 1823 年在误差 e1,…,en 独立同分布的假定下,证明了最小二乘方法的一个最优性质: 在所有无偏的线性估计类中,最小二乘方法是其中方差最小的!
Python基础积累
字符串
name="alex"
print(name.capitalize())
运行结果:
Alex
注:capitalize()使得首写子母大写。
print(name.count("a"))
运行结果:
1
注:统计字母个数。
print(name.center(50,"-"))
运行结果:
-----------------------alex-----------------------
注:总共打印50个字符,并把nam放在中间,不够的用-补上。
print(name.endswith("ex"))
运行结果:
True
注:判断字符串是否以ex结尾。
name="alex tname is alex"
print(name.expandtabs(tabsize=30))
运行结果:
alex name is alex
注:原本的t为一个tabsize键,现在将name中t转为30个空格。
print(name.find("x"))
运行结果:
3
注:取索引。
print(name[name.find("x"):])
运行结果:
x name is alex
注:字符串切片,这里的应用是从x这里开始切片。
name="my tname is {name} and i am {year} old"
print(name.format(name="alex",year=23))
运行结果:
my name is alex and i am 23 old
注:将集合里面的name、year进行替换,这是集合打印的第一种形式
print(name.format_map({'name':'alex','year':23}))
运行结果:
my name is alex and i am 23 old
注:这是集合打印的第二种形式。
print('ab123'.isalnum())
运行结果:
True
注:isalnum()包含所有字母及数字,如果不是这两个,则为False。
print('ab123'.isalpha())
运行结果:
False
注:isalpha()判断包含纯英文字符,若否,则返回值为False。
print('1A'.isdecimal())
运行结果:
False
注:判断是否是十进制,若否,则返回值为False。
print('1A'.isdigit())
运行结果:
False
注:判断是否是整数,若否,则返回值为False。
print('_'.isidentifier())
运行结果:
True
注:判断是否是合法的标识符,若是,则返回值为True。
print('aasd'.islower())
运行结果:
True
注:判断是否是小写,若是,则返回值为True。
print(' '.isspace())
运行结果:
True
注:判断是否是空格,若否,则返回值为False。
print('My name is'.istitle())
运行结果:
False
注:istitle()检测字符串中所有的单词拼写首字母是否为大写,且其他字母为小写。
注:如果字符串中所有的单词拼写首字母为大写,且其他字母为小写则返回True,否则返回 False。
print('+'.join(['1','2','3']))
运行结果:
1+2+3
注:对一列表中所有元素进行join操作。
print(name.ljust(50,'*'))
运行结果:
my name is {name} and i am {year} old************
注:左对齐字符串,多余位用*补全。
print(name.rjust(50,'-'))
运行结果:
------------my name is {name} and i am {year} old
注:右对齐字符串,多余位用-补全。
print('n Alex'.lstrip())
运行结果:
Alex
注:去掉左边的空格/回车。
print('nAlexn'.rstrip())
运行结果:
Alex
注:去掉右边的空格/回车。
print('nAlexn'.strip())
运行结果:
Alex
注:去掉左边和右边的空格/回车。
print('Alex')
Alex
p=str.maketrans("abcdef","123456")
print("alex li".translate(p))
运行结果:
1l5x li
注:把alex li换成上一行对应的值。
注:Python中maketrans()用于创建字符映射的转换表。
注:第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
注:maketrans() 中两个字符串的长度必须相同,为一一对应的关系。
注:Python中translate() 方法根据参数table给出的表(包含 256 个字符)转换字符串的字符, 要过滤掉的字符放到 del 参数中。
注:table -- 翻译表,翻译表是通过maketrans方法转换而来。deletechars -- 字符串中要过滤的字符列表。
注:例如:
- from string import maketrans # 引用 maketrans 函数。
- intab = "aeiou"
- outtab = "12345"
- trantab = maketrans(intab, outtab)
- str = "this is string example....wow!!!";
- print str.translate(trantab);
- 以上实例输出结果如下:th3s 3s str3ng 2x1mpl2....w4w!!!
print("alex li".replace('l','L',1))
运行结果:
aLex li
注:替换 1表示替换几个l,从左到右计算替换个数。
注:Python中replace()函数把字符串中的 old(旧字符串) 替换成 new(新字符串)。
注:如果指定第三个参数max,则替换不超过 max 次。
注:str.replace(old, new[, max])
print("alex li".rfind('l'))
运行结果:
5
注:找到的最右边的 下标 返回。
print("alex li".split('l'))
运行结果:
['a', 'ex ', 'i']
注:默认将字符串按照空格分隔成列表,也可以在()中填写相应的分隔符。
注:比如以字符l分隔,print("alex li".split(‘l’)),而且分隔符在列表中不会出现。
print("1+2+3+4".split('+'))
运行结果:
['1', '2', '3', '4']
注:将+号分离出来。
print("1+2n+3+4".splitlines())
运行结果:
['1+2', '+3+4']
注:Python splitlines() 按照行('r', 'rn', n')分隔,返回一个包含各行作为元素的列表。
注:如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。
注:keepends -- 在输出结果里是否保留换行符('r', 'rn', n')。
注:默认为 False,不包含换行符,如果为 True,则保留换行符。
print("Alex Li".swapcase())
运行结果:
aLEX lI
注:swapcase函数是用于对字符串的大小写字母进行转换。
print('lex li'.title())
运行结果:
Lex Li
注:将字符串改为title格式。
print('lex li'.zfill(50)) #不够以0填充
print('---')
运行结果:
00000000000000000000000000000000000000000000lex li
---
注:zfill()函数返回指定长度的字符串,原字符串右对齐,前面填充0。