因 子 分 析

目录

1 模型简介

2 因子分析与主成分分析的对比

3 原理

3.1 原理

3.2 假设

3.3 因子模型的性质

3.4 因子载荷矩阵的统计意义

4 具体操作

4.1 参数估计

4.2 因子旋转

4.2.1 理论

4.2.2 方法

4.3 因子得分

5 SPSS操作步骤

5.1 第一次运行

5.2 第二次运行

5.3 结果分析

5.3.1 共性方差

5.3.2 总方差解释表

5.3.3 成分矩阵

5.3.4 旋转后的因子载荷散点(组件)图

5.3.4 因子得分


1 模型简介

 

2 因子分析与主成分分析的对比

 例子:

 

要对原来的数据进行降维,十项得分被降维成四个方面,十五个方面降维成五个因子

3 原理

3.1 原理

 

3.2 假设

要进行因子分析,那就必须要解出来A这个矩阵,因此我们进行一些假设用来计算A矩阵

 

3.3 因子模型的性质

 

 既然因子载荷不唯一,我们在实际应用时就可以用这点进行变换(因子旋转),使得新的因子具有更容易解释的意义,这就是为什么因子分析往往比主成分分析更容易解释。

 

3.4 因子载荷矩阵的统计意义

 那么aij究竟是什么东西?

 

 

 

4 具体操作

4.1 参数估计

 SPSS提供的七种方法:

 选择容易解释的方法就可以

4.2 因子旋转

4.2.1 理论

 接近于0或者1就方便解释了,举一个例子:

六个指标,物化生政史地,两个因子,理和文,那物化生那行里面文因子前面的系数就应该接近于0,理因子系数就应该接近于1,政史地那边同理(例子非常不严谨,只是用来简单理解)

4.2.2 方法

 选择哪种方法没有严格规定,尽可能好解释就可以(常见的是最大方差)

4.3 因子得分

 (论文中常用的是第三种)

5 SPSS操作步骤

5.1 第一次运行

 概念解释:

 

 

第一次运行的结果一般作为参考,首先我们要确定的是原始数据是否适合进行因子分析,第一次运行之后的话可以这样说:

 

好,现在就要确定因子的数目了

 

5.2 第二次运行

注意碎石图只是一个参考,有时事先就已经知道了最后要确定的因子数,那碎石图意义就不大了

5.3 结果分析

5.3.1 共性方差

 

5.3.2 总方差解释表

 

5.3.3 成分矩阵

 

5.3.4 旋转后的因子载荷散点(组件)图

 

5.3.4 因子得分

 尽管很多论文都把因子分析模型用到综合评价里了,但这是存在很大问题的,例如变量的类型,选择因子的方法,旋转等等因素都是很难说清楚的。

好的,首先我们需要定义文法和词法规则。假设我们的语言是一个简单的算术表达式语言,支持加减乘除和括号,那么我们可以定义如下的文法和词法规则: 文法: ``` <expr> ::= <term> | <term> <addop> <expr> <term> ::= <factor> | <factor> <mulop> <term> <factor> ::= <number> | '(' <expr> ')' | <id> <id> ::= <letter> | <letter> <id> <number> ::= <digit> | <digit> <number> <addop> ::= '+' | '-' <mulop> ::= '*' | '/' ``` 词法规则: - 数字:由连续的数字组成 - 标识符:由连续的字母组成 - 运算符:+、-、*、/、(、) 接下来我们就可以开始编写自顶向下递归下降的语法器了。首先,我们需要定义一个词法器,将输入的字符串转换成 token 序列: ```python import re class Token: def __init__(self, type, value): self.type = type self.value = value class Lexer: def __init__(self, text): self.tokens = [] self.text = text self.pos = 0 self.current_char = self.text[self.pos] def error(self): raise Exception('Invalid character') def advance(self): self.pos += 1 if self.pos >= len(self.text): self.current_char = None else: self.current_char = self.text[self.pos] def skip_whitespace(self): while self.current_char is not None and self.current_char.isspace(): self.advance() def integer(self): result = '' while self.current_char is not None and self.current_char.isdigit(): result += self.current_char self.advance() return int(result) def id(self): result = '' while self.current_char is not None and self.current_char.isalpha(): result += self.current_char self.advance() return result def get_next_token(self): while self.current_char is not None: if self.current_char.isspace(): self.skip_whitespace() continue if self.current_char.isdigit(): return Token('INTEGER', self.integer()) if self.current_char.isalpha(): return Token('ID', self.id()) if self.current_char == '+': self.advance() return Token('PLUS', '+') if self.current_char == '-': self.advance() return Token('MINUS', '-') if self.current_char == '*': self.advance() return Token('MULTIPLY', '*') if self.current_char == '/': self.advance() return Token('DIVIDE', '/') if self.current_char == '(': self.advance() return Token('LPAREN', '(') if self.current_char == ')': self.advance() return Token('RPAREN', ')') self.error() return Token('EOF', None) ``` 接下来,我们就可以定义语法器了。我们可以使用递归下降的方式来实现,每个非终结符对应一个递归函数。在每个递归函数中,我们可以根据当前的 token 类型来选择相应的语法规则,同时维护符号表。 ```python class Node: pass class BinOp(Node): def __init__(self, left, op, right): self.left = left self.token = self.op = op self.right = right class Num(Node): def __init__(self, token): self.token = token self.value = token.value class Var(Node): def __init__(self, token): self.token = token self.value = token.value class Parser: def __init__(self, lexer): self.lexer = lexer self.current_token = self.lexer.get_next_token() def error(self): raise Exception('Invalid syntax') def eat(self, token_type): if self.current_token.type == token_type: self.current_token = self.lexer.get_next_token() else: self.error() def factor(self): token = self.current_token if token.type == 'INTEGER': self.eat('INTEGER') return Num(token) elif token.type == 'LPAREN': self.eat('LPAREN') node = self.expr() self.eat('RPAREN') return node elif token.type == 'ID': self.eat('ID') return Var(token) def term(self): node = self.factor() while self.current_token.type in ('MULTIPLY', 'DIVIDE'): token = self.current_token if token.type == 'MULTIPLY': self.eat('MULTIPLY') elif token.type == 'DIVIDE': self.eat('DIVIDE') node = BinOp(left=node, op=token, right=self.factor()) return node def expr(self): node = self.term() while self.current_token.type in ('PLUS', 'MINUS'): token = self.current_token if token.type == 'PLUS': self.eat('PLUS') elif token.type == 'MINUS': self.eat('MINUS') node = BinOp(left=node, op=token, right=self.term()) return node def parse(self): return self.expr() ``` 最后,我们可以测试一下我们的语法器: ```python text = 'a + b * (c - d) / e' lexer = Lexer(text) parser = Parser(lexer) tree = parser.parse() print(tree) ``` 输出结果为: ``` <__main__.BinOp object at 0x7f3a2b9f3b50> ``` 这表明我们已经成功地构建了语法树。我们可以通过遍历语法树来实现代码的执行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值