mxxhcm's blog

  • 首页

  • 标签

  • 分类

  • 归档

assamble MIPS

发表于 2018-10-24 | 更新于 2019-12-17 | 分类于 汇编

技巧

怎么写汇编程序。
写一个函数时,在被调用函数内,首先说明参数,表明每个寄存器存放的都是什么。比如a0-a3,都存放的是什么。在调用功能函数内,使用a0-a3传递参数。
先使用寄存器,最后在分配栈帧大小。。

s0-s7可以用来保存数据,比如函数A调用函数B,函数A中使用的s0-s7,在调用完函数B返回后,s0-s7原来的值是什么,现在就还是什么。
t0-t9就随用随操作。
在写循环的时候
先写循环的框架。。

MIPS R2000 指令格式

每条指令都是32位长,由几个bits field构成,如下所示:

6 bits 5 bits 5 bits 5 bits 5 bits 6 bits
寄存器 op reg1 reg2 des shift funct
立即数 op reg1 reg2 16位常数
jump op 26位常数

前六位是op域,确定这条指令是寄存器指令,立即数指令还是jump指令,从而确定后面的指令该如何被解释。
如果op域是0,表示这是一条寄存器指令,通常执行一个算术或者逻辑运算。funct域指定要执行的操作,reg1和reg2表示用作操作数的寄存器,des表示存储结果的寄存器。

MIPS Register集合

MISP R200 CPU总共有32个寄存器,其中31个都是通用寄存器,可以用来存储任何指令,剩下的一个,叫做register zero,任何时候存放的总是0。
尽管理论上任意一个register都可以用作任何目的。MIPS程序员通常有一个默认的规定:

symbolic name 序号 用途
zero 0 一直存放的都是常数0。
at 1 保留
v0-v1 2-3 包含返回值,如果值是单字的,只有$v0有用
a0-a3 4-7 参数寄存器,包含一个子程序调用的前4个参数
t0-t9 8-15, 24-25 临时寄存器0到9
s0-s7 16-23 保存寄存器0到7
k0-k1 26-27 内核寄存器0,1,DO NOT USE
gp 28 全局数据指针用于定位static global varaibles。现在忽略它
sp 29 栈指针
fp 30 帧指针
ra 31 返回地址

SPIM环境系统调用

service code 参数 结果
打印int 1 $a0 在console打印出int
打印float 2 $f12 在console打印出float
打印double 3 $f12 在console打印出double
打印string 4 $a0 在console打印出string
读入int 5 none 结果存放在v0
读入float 6 none 结果存放在f0
读入double 7 none 结果存放在f0
读入string 8 $a0存放地址,$a1存放长度 空
sbrk 9 $a0(长度) $v0
exit 10 空 空

Stack Frames

每一次调用一个子程序,就会专门为当前子程序调用创建一个独一无二的栈帧。在递归调用的情况下,创建了很多个栈帧,每一次调用就有一个。栈帧的组织形式是很重要的,因为它们需要在调用者和被调者之间传递参数,定义寄存器如何在调用函数和被调用函数之间共享。此外,还需要在被调用函数的栈帧内定义局部变量的存储格式。每个栈帧的最小值是32。
一般来说,一个子程序调用的栈帧可能包含以下的内容:

  • 传递给子程序的参数
  • saved寄存器的值($s0到$s7)
  • 子程序调用返回地址($ra)
  • 局部变量

如下图所示,栈从高地址向低地址增长。

每个stack frame被分成了五个区域:

  1. 参数区域,存放子程序调用的其他子程序所需要的参数。它们不会被当前子程序使用,而是用于当前子程序调用的子程序。前四个参数可以使用参数寄存器($a0到$a3)进行传递,如果超过四个参数,就存放在sp+16, sp+20, 等等。也就是说当前栈帧最底部存放的是它调用的子程序所需要的参数,如果它没有调用子程序,那就不需要这个区域了。
  2. 保留寄存器区域用于保存saved寄存器($s0到$s7)的值。这些寄存器的值在进入当前子程序时就被保存,在子程序返回前,从这个区域将值复制到saved寄存器。在这期间,saved寄存器的值可以随意使用。这个很有用哦。
  3. 返回地址区域用于存放返回地址寄存器($ra)的值,这个值在当前子程序被执行的时候,就被复制到栈上,在当前子程序返回前被拷贝回去。如果当前子程序没有调用其他子程序,不需要这个区了。
  4. Pad区域是保证栈帧的总大小是8的倍数。在这里插入是为了确保,局部变量的存储区域总是以双字开始的。
  5. 局部存储区域用于局部变量的存储。当前子程序必须保留足够的字存放局部变量和局部寄存器($t0到$t9)的值。这个区域也必须进行padding确保它的大小总是8 words的整数倍。

总结以下,当一个函数被调用时,为它创建一个栈帧,这个栈帧的最小值是32,最大值不限,要能容纳所有要保存的对象,包括上面介绍的五个部分。具体怎么操作呢。如果当前函数被调用了,首先移动sp到能容纳下所有要保存的内容,然后保存返回地址,保存可能使用到的saved寄存器。然后将传递给这个子程序的参数,$a0到$a3这几个参数的值存放在调用当前函数的函数的栈帧底部,然后当前函数用到这几个值时,从那里获取,超过4个参数的通过栈传递,直接存放在sp+16, sp+20等位置。
比如当前函数调用了两次子函数,需要用到传递给当前函数的这几个参数,在这几个子函数调用前后参数值不应该改变。

MIPS Insturction Set

  • 如果op包含 a(u),这条指令是有符号数或者无符号数参与的算术运算,取决于有没有u。
  • des 一定是一个寄存器
  • src1 一定是一个寄存器
  • reg2 一定是一个寄存器
  • src2 可以是一个寄存器,也可以是一个32位整数
  • addr一定是一个地址。

区别

1
2
3
4
5
6
7
8
    .data
array: .space 1024*4
.text
la $t1, array # la将数组的地址存放到一个寄存器
lw $a0, ($t1) # lw将数组地址的内容load出来
lw $a0, 24($t1)

move $t2, $t1

算术指令

  • mul des, src1, src2 将寄存器src1和寄存器或者数值src2的结果存放在寄存器des
  • mulo des, src1, src2 有溢出
  • mult(u) src1, reg2 将寄存器src1和寄存器reg2的结果存放在lo和寄存器hi上。
  • div src1, reg2
  • div des, sr1, src2
  • add(u) des, src1, src1

比较指令

分支和跳转指令

分支(branch)

  • beq ssr1, src2, lab

  • ble sr1, src2, lab 如果src1 <= src2,跳转到lab

  • bgt sr1, src2, lab 如果src1 >= src1,跳转到lab

和零比

  • beqz src1, lab 如果寄存器src1的值等于0,跳转到lab
  • bnez src1, lab 如果寄存器src1的值不等于0,跳转到lab
  • blez src1, lab 如果寄存器src1的值小于等于0,跳转到lab
  • bgez src1, lab 如果寄存器src1的值大于等于0,跳转到lab

跳转

  • j label 跳转到一个label
  • jr src1 跳转到一个位置src1
  • jar label 跳转到label,并且存储下一条指令到$ra
  • jalr src1 跳转一个位置src1,并且将下一条指令的位置存储到$ra

Load,Store和数据移动

Load

  • la des, addr 加载一个label的地址到des
  • lw des, addr 加载地址addr处的一个word
  • li des, const 加载一个而常数到des

Store

数据移动

  • move des, src1 将寄存器src1的内容复制到寄存器des中
  • mfhi des 将hi中的内容复制到des中
  • mflo des 将lo中的内容复制到des中
  • mthi src1 将寄存器src1中的内容复制到hi中
  • mtlo src1 将寄存器src1中的内容复制到lo中

异常处理

SPIM Assembler

段和链接器指令

数据指令

.asciiz str,汇编给定的以null结尾的字符串,
.ascii str,汇编给定的不以null结尾的字符串
.byte byte1 … byteN,汇编给定的字节(八位整数)
.half half1 … halfN,汇编给定的半字(十六位整数)
.word word1 … wordN,汇编给定的字(三十二位整数)
.space size,在当前的段中分配n字节的空间,在SPIM中,只允许在数据段中进行。

参考文献

MIPS教程
1.https://sites.cs.ucsb.edu/~franklin/64/lectures/mipsassemblytutorial.pdf
MIPS汇编指令以及对应的机器代码
2.http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html
3.https://courses.cs.washington.edu/courses/cse410/09sp/examples/MIPSCallingConventionsSummary.pdf
4.https://stackoverflow.com/questions/7748769/mips-programming-how-to-call-a-function-from-a-separate-file

python 继承

发表于 2018-10-23 | 更新于 2019-10-23 | 分类于 python

继承

和C++一样,python也是面向对象的变成语言,也支持封装继承和多态。python同时支持单继承和多继承。
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从一般到特殊的过程。在某些语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。
继承概念的实现方式主要有2类:实现继承、接口继承。

  • 实现继承是指使用基类的属性和方法而无需额外编码的能力。
  • 接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力(子类重构爹类方法)

python继承定义

父类定义

1
2
3
class Person(object):
def gender(self):
return "Unknown"

子类定义

1
2
3
class Man(Person):
def gender(self):
return "male"

python构造函数继承

父类构造函数

1
2
3
class Person(object):
def __init__(self, name):
self.name = name

子类构造函数

1
2
3
class Woman(Person):
def __init__(self, name):
super(Person, self).__init__(name)

或者

1
2
3
class Woman(Person):
def __init(self, name):
Person.__init__(self, name)

python接口继承

父类

1
2
3
4
5
6
class Person(object):
def __init__(self, name):
self.name = name

def gender(self):
return NotImplentedError

子类

1
2
3
4
5
6
7
class Man(Person):
def __init__(self, name):
super(Man, self).__init__(name)
self.name = name

def gender(self):
return "male"

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class Person(object):
def __init__(self, name):
self.name = name

def work(self):
return NotImplementedError


class Chief(Person):
def __init__(self, name, salary):
super(Chief, self).__init__(name)
self.salary = salary

def work(self):
print("cook...")


class Student(Person):
def __init__(self, name, grades, person):
super(Student, self).__init__(name)
self.grades = grades
self.person = person

def work(self):
print("study...")

class A(Student):
def __init__(self, name, grades, person):
super(A, self).__init__(name, grades, person)
self.type = "A"


class B(A):
def __init__(self, name, grades, person):
super(B, self).__init__(name, grades, person)
self.type = "B"



if __name__=="__main__":
chief = Chief("chief_a", 100)
student = Student("student", 200, chief)
a = A("student_a", 300, student)
b = B("student_b", 400, a)


print(b.person.name)
print(b.person.person.name)
print(b.person.person.person.name)

参考文献

1.https://www.cnblogs.com/bigberg/p/7182741.html

R basic

发表于 2018-10-21 | 更新于 2020-02-20 | 分类于 其他编程语言

矩阵索引

1
2
3
4
5
6
7
8
9
10
# 下标都是从1开始
A=matrix(1:16, 4, 4)
A
# 矩阵下标
A[2,3]
# 不包含
A[-c(1,3)] # 不包含第一行和第三行
A[,-c(2)] # 不包含第二行
# 矩阵维度
dim(A)

常用命令

赋值

1
2
3
4
x <- c(1, 3, 2,5)
# c是连接的意思,括号中的数被连在一起
# 也可以用等号
x = c(1, 6, 2)

长度

1
2
x = c(1, 6, 2)
length(x)

删除varaibles

1
2
rm(x)   # 删除x
rm(list=ls()) #

查看variables

1
ls()

矩阵

1
2
#matrix()    # 创建一个矩阵
matrix(data=c(1,2,3,4), nrow=2, ncol=2,byrow=TRUE) # byrow=TRUE表示先行后列

转置

1
2
a = matrix(c(1,2,3,4), 4, 4)
at = t(a)

幂和开方

1
2
3
x^3
poly(x, 4)
sqrt(x)

正态分布

1
2
3
4
# 默认的均值和方差是0,1
x = rnorm(n=10, mean=50, std=0.1)
y = x + rnorm(50)
cor(x,y) # 相关系数

均匀分布

1
x = runif(100, -100, 100)

随机数种子

1
2
set.seed(1303)
# 设置完随机数之后,产生的随机数都是可以复现的

均值和方差,标准差

1
2
3
4
5
set.seed(3)
y=rnorm(100)
mean(y)
var(y)
sd(y)

seq创建序列

1
2
3
# seq(a,b)
a= seq(1, 3, 1)
3:11 = seq(3, 11)

绘图

plot二维

1
2
3
4
5
6
7
8
x = rnorm(100)
y = rnorm(100)
plot(x, y)
plot(x, y, xlab="x-axis", ylab="y-axis", main="x-y")
# 保存在主目录下
pdf("Figure.pdf")
plot(x,y, col="green")
dev.off()

contour等高线和image heatmap,persp()三维图

1
2
3
4
5
6
7
8
x = seq(-pi,pi)
y = x
f = outer(x, y, function(x,y)cos(y)/(1+x^2))
contour(x, y, f)
fa = (f - t(f)) /2
contour(x, y, fa)
image(x, y, fa)
persp(x, y, fa)

加载数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1.header=TRUE 表示第一行是变量名
# na.string表示缺失符号
auto_data = read.table("Auto.data", header = T, na.strings = "?")

# 2.使用fix查看数据
fix(auto_data)

# 3. 查看数据维度
dim(auto_data)


# 4.忽略不规则数据
na.omit(auto_data)
dim(auto_data)

# 5.查看变量名字
names(auto_data)

其他操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
auto_data = read.table("Auto.data", header = T, na.strings = "?")
auto_data = na.omit(auto_data)
names(auto_data)

# 1. 访问dataset中的变量
plot(auto_data$cylinders, auto_data$mpg)
# or
attach(auto_data)
plot(cylinders, mpg)

# 2. as.factor() and boxplot
cylinders = as.factor(cylinders)
plot(cylinders, mpg)

# 3.绘制直方图
hist(mpg)

# 4. pairs()绘制任意两个变量之间的散点图矩阵
pairs(auto_data)
pairs(~mpg+weight, auto_data)

# 5. 识别图中鼠标点击的点的坐标
plot(horsepower, mpg)
identify(horsepower, mpg, name)

# 6.summary()给出指定变量的描述信息
summary(auto_data)

库

安装package

1
install.packages("ISLR")

加载package

1
library(ISLR)

分支

for循环

1
2
3
4
5
6
7
8
9
10
11
12
for (val in sequence)
{
statement
}

# 示例
x <- c(2,5,3,9,8,11,6)
count <- 0
for (val in x) {
if(val %% 2 == 0) count = count+1
}
print(count)

while 循环

1
2
3
4
while (TRUE)
{
print("hello")
}

if 语句

1
2
if (3 > 2 && 2 < 3):
print(

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
rand_interval = function(min, max, number)
{
sd = (max.numeric()-min.numeric())/3
count = 0
res = 1:number
while(TRUE)
{
x = rnorm(1, mean=0,sd=sd)
if(x >= min && x <= max)
{
count = count+1
res[count] = x
}
}
return (res)
}

min = -100
max = 100
number = 20
x1 = rand_interval(min, max, number)

类型转换

字符转数值

1
as.numeric(str(3))

写入文件

1
2
3
library("xlsx")
data = matrix = c()
write.xlsx(data, file = "myworkbook.xlsx", append = FALSE)

qqplot
ggplot2
lm

参考文献

1.https://www.datamentor.io/r-programming/for-loop/

classfication

发表于 2018-10-21 | 更新于 2019-12-17 | 分类于 机器学习

Classfication

LDA

Logistic Regression

Logistic function

$$ S(x) = \frac{1}{1+e^{x} }$$
如下图所示:
logistic_func
它的取值在$[0,1]$之间。
logistic regression的目标函数是:
$$h(x) = \frac{1}{1+e{-\thetaT x} 3}$$
其中$x$是输入,$\theta$是要求的参数。

思路

Logistic regression利用logistic function进行分类,给出一个输入,经过参数$\theta$的变换,输出一个$[0,1]$之间的值,如果大于$0.5$,把它分为一类,小于$0.5$,分为另一类。这个$0.5$只是一个例子,可以根据不同的需求选择不同的值。
$\theta^T x$相当于给出了一个非线性的决策边界。

Cost function

$$J(\theta) = -\log L(\theta) = -\sum_{i=1}^m (y(i)\log h(x^{(i)}) + (1-y{(i)})\log(1-h(x{(i)} )) )$$
给出两种方式推导logistic regression的cost function

Maximum likelyhood estimation

通过极大似然估计推导得到的,当是两个类别的分类时,即$0$或者$1$,有:
$$P(y=1|x,\theta) = h(x)$$
$$P(y=0|x,\theta) = 1- h(x)$$
服从二项分布,写成一个式子是:
$$P(y|x,\theta) = h(x)^y (1-h(x))^{1-y}$$
其中$y$取值只有$0$和$1$。
有了$y$的表达式,我们就可以使用最大似然估计进行求解了:
$$L(\theta) = \prod_{i=1}^m (h(x{(i)}){y(i)}(1-h(x^{(i)} )){(1-y{(i)})}$$
似然函数要求最大化,即求使得$m$个observation出现概率最大的$\theta$,
损失函数是用来衡量损失的,令损失函数取负的对数似然,然后最小化loss也就是最大化似然函数了:
$$J(\theta) = -\log L(\theta) = -\sum_{i=1}^m (y(i)\log h(x^{(i)}) + (1-y{(i)})\log(1-h(x{(i)} )) )$$

Cross-entropy

对于$k$类问题,写出交叉熵公式如下所示:
$$J(\theta) = -\frac{1}{n}\left[\sum_{i=1}^m \sum_k y_k^{(i)} \log h(x_k^{(i)} ) \right]$$
当$k=2$时:
$$J(\theta) = -\frac{1}{n}\left[\sum_{i=1}^m y^{(i)} \log h(x^{(i)} ) + (1-y^{(i)}) \log (1-h(x^{(i)} ))\right]$$

梯度下降

$$J(\theta) = -\log L(\theta) = -\sum_{i=1}^m \left[y(i)\log h(x^{(i)}) + (1-y{(i)})\log(1-h(x{(i)} )) \right]$$

\begin{align*}
\nabla J & = -\sum_{i=1}^m \left[ y(i)\frac{1}{h(x^{(i)})}\nabla h(x^{(i)}) - (1-y{(i)})\frac{1}{\log(1-h(x{(i)} ))}\nabla\log(1-h(x^{(i)} ))\right]
&=-\sum_{i=1}^m (h(x^{(i)}) - y^{(i)}) x^{(i)}
\end{align*}

参考文献

1.https://blog.csdn.net/jk123vip/article/details/80591619
2.https://zhuanlan.zhihu.com/p/28408516
3.https://www.cnblogs.com/pinard/p/6029432.html

regression

发表于 2018-10-21 | 更新于 2020-01-26 | 分类于 机器学习

linear regression

这一部分主要介绍线性回归。

simple linear regression

第一节介绍两个变量的linear regression,也叫simple linear regression,假设$X$和$Y$之间存在线性关系。用
$$Y = \beta_0 + \beta_1 X \tag{1}$$
表示。然后根据我们已有的数据集划分训练集和测试集,使用训练集上的$n$组数据学习相应的参数,使得学习出的直接尽可能进行这$n$组数据点,即$y_i\approx \hat{\beta_0} + \hat{\beta_1}x_i$。

参差平方和

最小二乘法的目标是最小化残差平方和:
$$ \text{RSS} = e_1^2 + e_2^2 + \cdots e_n^2 \tag{2}$$
即
$$ \text{RSS} = (y_1-\hat{\beta_0}- \hat{\beta_1}x_1)^2 + (y_2-\hat{\beta_0}- \hat{\beta_1}x_2)^2 + \cdots (y_n-\hat{\beta_0}- \hat{\beta_1}x_n)^2 \tag{3}$$
最小二乘法通过最小化残差平方和,得到:
$$\hat{\beta_1} = \frac{\sum_{i=1}^n (x_i-\bar{x}(y_i-\bar{y}}{\sum_{i=1}n(x_i-\bar{x})2 } \tag{4}$$
$$\hat{\beta_0} = \bar{y} - \hat{\beta_1}\bar{x}\tag{5}$$

系数准确性

标准差

$$SE(\bar{\mu}) = \sqrt{var(\bar{\mu})}$$

置信区间

假设检验

零假设(hull hypothesis):
$H_0:X$和$Y$之间没有关系,
备择假设(alternative hypothesis):
$H_a:X$和$Y$之间有一定关系,
数学上,就相当于检验:
$H_0:\beta_1 = 0$和$H_a:\beta_1 \neq 0$
如果$\beta_1 = 0$,则$Y=\beta_0 + \epsilon$,即说明$X,Y$不相关。怎么判断$\beta_1$是否为$0$。这取决于$\beta_1$的准确性,和$\text{SE}(\hat{\beta_1})$相关。在实践中,计算$t$统计量:
$$t=\frac{\hat{\beta_1} -0}{\text{SE}(\hat{\beta_1})$$
假设$\beta_1=0$,观测任意观测值大于$\vert t\vert$的概率就行了,这个值称为$p$值。一个很小的$p$值表示,自变量和因变量之间的真实关系未知时,不太可能完全由于偶然观察到自变量和因变量之间的强相关。$p$值足够小,就决绝零假设。
所以方法是:

  1. 计算$t$统计量
  2. 计算$p$值
  3. p很小,决绝零假设,接收备择假设。

模型准确性

如果拒绝零假设,选择备择假设,想要量化模型拟合的程度。给出两个指标:

Residual standard error (RSE)

RSE定义如下:
$$ \text{RSE} = \sqrt{\frac{1}{n-2} RSS} = \sqrt{\frac{1}{n-2} \sum_{i=1}n(y_i-\hat{y_i})2 }
其中$\text{RSS} =\sum_{i=1}n(y_i-\hat{y_i})2 $。

$R^2 $

$R^2$的取值在$0$和$1$之间,越接近于$1$越好。
$$R^2 = \frac{\text{TSS}-\text{RSS}}{\text{TSS}} = 1- \frac{\text{RSS}}{\text{RSS}}$$
其中$\text{TSS} = \sum(y_i - \bar{y})^2$是 total sum of squares。

相关性

多元线性回归

假设有$p$个自变量,一个因变量$Y$,则假设多元线性回归方程为:
$$Y = \beta_0 + \beta_1 X_1+ \beta_2 X_2 + \cdots+ \beta_p X_p + \epsilon \tag{1}$$
其中$X_j$表示第$j$个自变量,$\beta_j$表示第$j$个自变量和因变量之间的关系,$\beta_j$可以解释为,所有其他自变量不变的情况下,$X_j$增加一个单位,对$Y$产生的平均效果。

计算回归系数

有时候多元线性回归和简单线性回归可能会得到相反的结果,即某些变量的取值,在一个中为$0$,在另一个中不为$0$。但是实际上,它们表述的东西是一样的,多元线性回归中的某两个变量可能和简单线性回归中的一个变量起到了相同的作用,这样子多元线性回归中这两个变量可能一个起作用,一个不起作用。

分析

假设检验

对于多元线性回归来说,我们需要判定是否所有的回归系数都为$0$,同样使用假设检验,
零假设:
$$H_0: \beta_1 = \beta_2 = \cdots \beta_p =0$$
备择假设:
$H_a:$至少有一个$\beta_j$不为$0$。

F统计量

$$F=\frac{(TSS-RSS)/p}{RSS/(n-p-1)}$$
其中$\text{TSS} = \sum(y_i-\bar{y})^2 , \text{RSS}= \sum(y_i - \bar{y_i})^2$。
如果假设是正确的,有:
$$\mathbb{E}\left[\text{RSS}/(n-p-1)\right] = \sigma^2$$
且
$$\mathbb{E}\left[(\text{TSS} - \text{RSS})/p\right] = \sigma^2$$
因此,如果零假设正确,有$F$接近于$1$;否则,$F \gt 1$。

重要变量选择

模型拟合

RSE

$$ \text{RSE} = \sqrt{\frac{1}{n-p-1}\text{RSS}}$$

其他注意事项

定性自变量

二值自变量

假设我们考虑女性和男性的信用卡债务差异,只考虑性别原因,忽略所有其他的因素,可以根据性别创建一个指标,或者叫做哑变量(dummy variable):
$x_i = 1$表示女性,$x_i=0$表示男性。
在回归方程中使用这个变量,得到:
$$y_i = \beta_0 + \beta_1 x_i + \epsilon_i = \begin{cases}\beta_0+\beta_1 + \epsilon_i, 女性\\\beta_0 + \epsilon_i,男性 \end{cases}$$
其中$beta_0$可能看成男性的信用卡债务,$\beta_0+\beta_1$是女性的平均信用卡债务,$\beta_1$就是男性和女性的差别了。
也可以用$1,-1$代替$0,1$。

多值定性自变量

比如种族,用两个哑变量:
$x_{i1}= \begin{cases}1,Asian\\ 0, non-Asian\end{cases}$
第二个哑变量:
$x_{i1}= \begin{cases}1,white\\ 0, non-white\end{cases}$
得到模型:
$y_i = \beta_0 + \beta_1 x_{i1} + \beta_2 x_{i2} + \epsilon_i$= \begin{cases}\beta_0 + \beta_1 +\epsilon_i \\ \beta_0 + \beta_2+\epsilon_2 \\\beta_0+\epsilon_i\end{cases}$

线性模型的扩展

去除可加性

线性回归模型假设所有的自变量和因变量之间的关系是可加和线性的。但是,可能两个自变量之间会有一定的作用,考虑两个变量的标准线性回归模型:
$$ Y = \beta_0 + \beta X_1 + \beta X_2 + \epsilon$$
根据这个模型,改变$X_1$,$X_2$的存在不影响结果,可以对该模型做一个扩展,加一个有$X_1,X_2$的乘积组成的交互项:
$$Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3 X_1X_2 + \epsilon$$
如果$X_1,X_2$之间的交互作用很重要,那么即使$X_1,X_2$各自系数的$p$值很大,这两个变量也应该在模型中。

去除非线性

多项式拟合

可能的问题

非线性拟合

绘制参差图,如果参差有规律,说明不适合当前的拟合方法。

误差项自相关

误差项方差不恒定

外点

误差特别大,真实值$y_i$异常。

高杠杆点

观测点$x_i$的值是异常的,就是$x_i$的取值和绝大部分$x_i$的取值不同。
计算杠杆统计量(leverage statistic):
$$h_i = \frac{1}{n} + \frac{(x_i-\bar{x})^2 }{ \sum_{j=1}^n (x_j - \bar{x})^2 }$$
$h_i$的取值总是在$\frac{1}{n}$和$1$之间,求所有观测的平均杠杆值是$\frac{p+1}{n}$,如果给定观测的杠杆量大大超过$\frac{p+1}{n}$,那么该点有较高的杠杆作用。

共线性

共线性指的是两个或者更多的自变量高度相关。
检测共线性的一个方法是看预测变量的相关系数矩阵。但是这种方法只能检测出两个变量之间的共线性。
可能有三个或者更多自变量之间的共线性,叫多重共线性。可以计算方差膨胀因子variance inflation factor(VIF),最小值是$1$,表示完全不存在共线性。一般来说,VIF超过$5$或者$10$就表示有共线性问题。
$$ VIF(\hat{\beta_j}) = \frac{1}{1-R^2_{X_j|X_{-j} } }$$
其中$R^2_{X_j|X_{-j} }$表示对$X_j$对所有自变量回归的$R^2$,如果它接近于$1$,就存在共线性。

KNN regression vs linear regression

真实情况是线性情况下,KNN可能会略逊于linear regression。
在真实情况是非线性情况下,当变量个数$p$取$1$或者$2$时,KNN优于linear regression。取$3$时,不确定。当$p\ge 4$时,linear regression优于KNN。更高的话会有curse of dimension。
如果变量个数很少,样本数很多,多项式拟合可能会拟合到误差。
当$K=1,2$时,

参考文献

linux-ubuntu install latex

发表于 2018-10-15 | 更新于 2019-12-17 | 分类于 linux

安装latex解释器

1
sudo atp install texliv-full

安装latex编辑器

1
sudo apt install textmaker

latex文件编写

编写就行了
title和maketitle,maketitle是制作首页的意思

1
\usepackage{gensymb} \circ

参考文献

1.https://milq.github.io/install-latex-ubuntu-debian/
2.https://www.overleaf.com/learn/latex/Questions/How_can_I_write_a_°_(degree)_symbol_in_LaTeX%3F?nocdn=true
3.https://tex.stackexchange.com/questions/45817/theorem-definition-lemma-problem-numbering

knn

发表于 2018-01-20 | 更新于 2019-10-22 | 分类于 机器学习

KNN

KNN的思路很简单,从训练集中(带标签)找到$k$个离待预测点最近的点,选出这$k$个最近点中最多的标签当做待遇测点的标签。
具体的思路:

  1. 计算待预测点距离训练集中所有点的距离
  2. 选择最近的$k$个训练集中的点
  3. 选择$k$个点中最多的label
  4. 这个label就是待遇测点的label

属性

  • 基于实例:必须基于具体的样本才能进行预测,因为整个训练集(带标签)都属于KNN的一部分。
  • 竞争学习:训练集中的每个元素都竞争预测结果。
  • 懒惰学习:不需要训练,直到需要预测的时候才会建立模型。

KNN classification

$$\text{Pr}(Y=j|X=X_0) = \frac{1}{K} \sum_{x_i\in N_0}I(y_i=j)

KNN regression

$$\hat{f}(x_0) = \frac{1}{K} \sum_{x_i\in N_0} y_i$$

参考文献

1.https://zhuanlan.zhihu.com/p/36549000

1…3334
马晓鑫爱马荟荟

马晓鑫爱马荟荟

记录硕士三年自己的积累

337 日志
26 分类
77 标签
RSS
GitHub E-Mail
© 2022 马晓鑫爱马荟荟
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Pisces v6.6.0