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)?答案 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)