用R表示奇异值分解(SVD)

时间:2015-11-24 16:08:25

标签: r math matrix svd

SVD适用于R:

A = matrix(1:12,3,4)
A
u = svd(A)$u
v = svd(A)$v
sigma = diag(svd(A)$d)
u %*% sigma %*% t(v)   # = A as desired

但与the usual statement of the SVD theorem不同,v 一个4x4矩阵(应该是!):

dim(v)   # (4,3)

为什么会这样?

根据定理,

  • v应为格式(4,4),
  • sigma应采用格式(3,4) 顺便说一句,创建diag(svd(A)$d)零填充的最短方式是什么样的格式(3,4)?

3 个答案:

答案 0 :(得分:3)

它只是一个不同的惯例,不同的系统/教科书将以一种或另一种方式定义SVD。重要的是单一财产U*U'=I。在任一惯例中,奇异向量将最小化投影中的最小平方距离。

这是一个理论的发展,其维度约定与LINPACK和R中的相同:https://www.cs.princeton.edu/courses/archive/spring12/cos598C/svdchapter.pdf

答案 1 :(得分:3)

要获得完整的 U V 矩阵,请使用nu=nv= svd()参数。要使用零填充对角矩阵,请使用nrow=的{​​{1}}和ncol=个参数:

diag()

答案 2 :(得分:1)

第二部分:

import subprocess
from bottle import run, post, request, response, get, route, Bottle, ServerAdapter

def jsonp(request, jsonstring):
    if (request.query.callback):
        return "%s(%s)" % (request.query.callback, jsonstring)
    return jsonstring

@get('/<path>')
def process(path):
    response.content_type = 'jsonp'
    jsonstring = subprocess.check_output(['python',"scripts/"+path+'.py'],shell=False).rstrip('\n')
    return jsonp(request, jsonstring)

# copied from bottle. Only changes are to import ssl and wrap the socket
class SSLWSGIRefServer(ServerAdapter):
    def run(self, handler):
        from wsgiref.simple_server import make_server, WSGIRequestHandler
        import ssl
        if self.quiet:
            class QuietHandler(WSGIRequestHandler):
                def log_request(*args, **kw): pass
            self.options['handler_class'] = QuietHandler
        srv = make_server(self.host, self.port, handler, **self.options)
        srv.socket = ssl.wrap_socket (
         srv.socket,
         certfile='server.pem',  # path to certificate
         server_side=True)
        srv.serve_forever()

srv = SSLWSGIRefServer(host="0.0.0.0", port=8081)
run(server=srv)