Skip to content

Commit

Permalink
lsa init
Browse files Browse the repository at this point in the history
  • Loading branch information
SmirkCao committed Jun 3, 2019
1 parent f4610d6 commit 0d682f3
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 4 deletions.
8 changes: 6 additions & 2 deletions CH17/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
- 所谓**表示**,可以认为是在某个坐标系(空间)下的坐标。
- 非负矩阵分解旨在用较少的基向量、系数向量来表示较大的数据矩阵。
- 感觉这章的章节结构看起来不是很清晰,在内容部分重新梳理了下结构。
- 在sklearn中LSA就是截断奇异值分解,作为一种降维的手段进行处理。而NMF是单独的一个模型,都是矩阵分解的范畴。

## 内容
### 向量空间模型
Expand Down Expand Up @@ -219,6 +220,9 @@ $$
去了停用词之后,做词频统计,得到了数据表。这个数据在[概率潜在语义分析](../CH18/README.md)部分的习题中再次引用了。
对应的这部分数据,实际上还可以做一些事情。可以尝试可视化下。

这个例子里面书中给出的参考结果是按照V做了符号调整,保证V中每一行的最大值,符号为正。




### 基于NMF的潜在语义分析模型
Expand All @@ -235,9 +239,9 @@ $m\times n$的非负矩阵$X\ge 0$。

其中
$W=\left[\begin{matrix}w_1& w_2& \cdots& w_k\end{matrix}\right]$表示话题向量空间
$w_1, w_2, \cdots, \w_k$表示文本集合的$k$个话题
$w_1, w_2, \cdots, w_k$表示文本集合的$k$个话题
$H=\left[\begin{matrix}h_1& h_2& \cdots& h_k\end{matrix}\right]$表示文本在话题向量空间的表示
$h_1, h_2, \cdots, \h_k$表示文本集合的$n$个文本
$h_1, h_2, \cdots, h_k$表示文本集合的$n$个文本
以上是基于非负矩阵分解的潜在语义分析模型。

非负矩阵分解有很直观的解释,话题向量和文本向量都非负,对应着“伪概率分布”,向量的线性组合表示**局部构成总体**。这个其实和DL里面的意思是一样的。
Expand Down
6 changes: 6 additions & 0 deletions CH17/data/data_1701.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
2., 0., 0., 0.
0., 2., 0., 0.
1., 2., 2., 1.
0., 0., 1., 0.
0., 0., 2., 3.
0., 0., 0., 1.
13 changes: 13 additions & 0 deletions CH17/lsa.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#! /usr/bin/env python
# Project: Lihang
# Filename: lsa
# Date: 6/03/19
# Author: 😏 <smirk dot cao at gmail dot com>


class LSA(object):
def __init__(self, ):
pass

def fit(self, x):
pass
21 changes: 19 additions & 2 deletions CH17/unit_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

class TestLSAMethods(unittest.TestCase):
def test_lsa_puffinwarellc_tutorial(self):
#
x = np.array([[0., 0., 1., 1., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1., 0., 0., 1.],
[0., 1., 0., 0., 0., 0., 0., 1., 0.],
Expand All @@ -26,9 +27,18 @@ def test_lsa_puffinwarellc_tutorial(self):
[0., 0., 0., 0., 0., 2., 0., 0., 1.],
[1., 0., 1., 0., 0., 0., 0., 1., 0.],
[0., 0., 0., 1., 1., 0., 0., 0., 0.]])
u, s, vh = np.linalg.svd(x, )
u, s, vh = np.linalg.svd(x, full_matrices=False)

# v based decision
max_abs_raws = np.argmax(np.abs(vh), axis=1)
signs = np.sign(vh[range(vh.shape[0]), max_abs_raws])
u *= signs
vh *= signs[:, np.newaxis]

print("\n")
print(40*"*"+"u"+40*"*")
print(np.round(u[:, :3], 2))

print(40*"*"+"s"+40*"*")
print(np.round(s[:3], 2))
print(40*"*"+"vh"+40*"*")
Expand All @@ -45,7 +55,14 @@ def test_lsa_fig_1701(self):
[0., 0., 0., 1.],
[1., 2., 2., 1.]])

u, s, vh = np.linalg.svd(x, )
u, s, vh = np.linalg.svd(x, full_matrices=False)

# v based decision
max_abs_raws = np.argmax(np.abs(vh), axis=1)
signs = np.sign(vh[range(vh.shape[0]), max_abs_raws])
u *= signs
vh *= signs[:, np.newaxis]

print("\n")
print(40*"*"+"u"+40*"*")
print(np.round(u[:, :3], 2))
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,8 @@

## CH17 潜在语义分析

- 在sklearn的定义中,LSA就是截断奇异值分解。

## CH18 概率潜在语义分析

## CH19 马尔可夫链蒙特卡罗法
Expand Down

0 comments on commit 0d682f3

Please sign in to comment.