<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>工作 on 念闻轩</title><link>https://www.siyuanxu.com/categories/%E5%B7%A5%E4%BD%9C/</link><description>Recent content in 工作 on 念闻轩</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 28 Jan 2020 18:38:33 +0800</lastBuildDate><atom:link href="https://www.siyuanxu.com/categories/%E5%B7%A5%E4%BD%9C/index.xml" rel="self" type="application/rss+xml"/><item><title>多参数的 python 简单并行循环 -- multiprocessing</title><link>https://www.siyuanxu.com/%E5%A4%9A%E5%8F%82%E6%95%B0%E7%9A%84-python-%E7%AE%80%E5%8D%95%E5%B9%B6%E8%A1%8C%E5%BE%AA%E7%8E%AF-multiprocessing/</link><pubDate>Mon, 27 Jan 2020 00:27:38 +0800</pubDate><guid>https://www.siyuanxu.com/%E5%A4%9A%E5%8F%82%E6%95%B0%E7%9A%84-python-%E7%AE%80%E5%8D%95%E5%B9%B6%E8%A1%8C%E5%BE%AA%E7%8E%AF-multiprocessing/</guid><description>&lt;p&gt;在之前用蒙特卡洛算法的时候我曾经舱室过用multiprocessing来对&lt;a href="https://www.siyuanxu.com/archives/16"&gt;for循环进行加速&lt;/a&gt; ，当时效果还是可以的，将循环中的操作包装成一个函数，即可传入可遍历的变量组即可有效利用多个线程进行同时计算。最近在分析自己DEM模拟试验的数据时又遇到了大量独立数据文件的io和分析，但是不同的是这次的计算需要在函数中传入多个变量，不变的要求是最小化业务代码更改。&lt;/p&gt;</description><content:encoded><![CDATA[<p>在之前用蒙特卡洛算法的时候我曾经舱室过用multiprocessing来对<a href="https://www.siyuanxu.com/archives/16">for循环进行加速</a> ，当时效果还是可以的，将循环中的操作包装成一个函数，即可传入可遍历的变量组即可有效利用多个线程进行同时计算。最近在分析自己DEM模拟试验的数据时又遇到了大量独立数据文件的io和分析，但是不同的是这次的计算需要在函数中传入多个变量，不变的要求是最小化业务代码更改。</p>
<p>其实实现起来也很简单，将业务函数进行二次包装，采用 *args 来进行变量传递即可。当然，同样不能忘了，多线程pool的代码一定要在主函数内，下面是我的颗粒信息数据整理例子。</p>
<!-- wp:code {"lineNumbers":true} -->
<pre class="wp-block-code"><code lang="python" class="language-python line-numbers"># work code
def ball_pos_plot(ball, speed):
    # plot the sample area and displacement path of a single particle
    return

# wrapper
def multi_wrapper(args):
    return ball_pos_plot(*args)

# multi processing
if __name__ == "__main__":
    pool=Pool(12)

    ball_list=[2020, 22, 16, 100, 1245, 213]

    speed_list=[0.0015,0.001,0.01,0.1]

    args_list=[]

    for ball in ball_list:
        for speed in speed_list:
            args_list.append([ball, speed])

    pool.map(multi_wrapper, args_list)</code></pre>
<!-- /wp:code -->
<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->
]]></content:encoded></item><item><title>windows小型文件server</title><link>https://www.siyuanxu.com/windows%E5%B0%8F%E5%9E%8B%E6%96%87%E4%BB%B6server/</link><pubDate>Fri, 14 Jun 2019 05:11:00 +0800</pubDate><guid>https://www.siyuanxu.com/windows%E5%B0%8F%E5%9E%8B%E6%96%87%E4%BB%B6server/</guid><description>&lt;!-- wp:paragraph --&gt;
&lt;p&gt;笔者很多时候会想从windows主机上共享文件，SMB分享呢不够通用，而且有时候在配置用户名和密码的时候由于字符编码不同会出现无法登陆的情况，ftp server 呢也是不够轻量。笔者理想的工具是一种web形式的文件系统，就像很多开源镜像站之类的，这样的话不需要考虑平台、编码等等一系列问题。终于在很多年的等待之后终于偶遇了__USBWebServer__ 这个项目。在这里记录一下这个软件解决我痛点的过程。&lt;/p&gt;</description><content:encoded><![CDATA[<!-- wp:paragraph -->
<p>笔者很多时候会想从windows主机上共享文件，SMB分享呢不够通用，而且有时候在配置用户名和密码的时候由于字符编码不同会出现无法登陆的情况，ftp server 呢也是不够轻量。笔者理想的工具是一种web形式的文件系统，就像很多开源镜像站之类的，这样的话不需要考虑平台、编码等等一系列问题。终于在很多年的等待之后终于偶遇了__USBWebServer__ 这个项目。在这里记录一下这个软件解决我痛点的过程。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>不过可惜的是并没有找到项目源地址，项目同名网站也已经和这个软件无关。GitHub上的<a href="https://github.com/mcclureski/usbwebserver-new">usbwebserver-new</a>是网友升级PHP版本后的项目，我也把我能找到的最新版本的软件通过google drive分享给大家<a href="https://drive.google.com/open?id=18TO_d2HWLOK92VN361mbSnBC4uLja6Ck">usbwebserver v8.6.2</a>。需要说明的是上述两个来源都与原作者无关，我也没有找到未编译的代码，所以请谨慎下载使用。我个人是没有遇到问题。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>软件以解压即用的绿色软件形式提供，打开usbwebserver.exe即可看到软件主界面。软件可以简单设置web root dir，apache port 和 MySQL port。相当于大家很熟悉的安装了PHP的Apache网络服务器。打开服务之后，通过localhost即可打开root dir，访问root文件夹中的文件，当然也可以作为本地测试环境使用。还是非常之方便的。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>对于我来说，我希望做的是文件server，那么如果只能访问root文件夹的话是极不方便的，我总不能把所有需要的文件统统复制到root中来，当然要使用链接的方式来快速访问分散的文件。但是一直对windows server很不熟悉，最开始误以为快捷方式就==Linux Server 中的软链接。其实windows中的快捷方式是一个文件，只是windows系统可以理解该文件代表的信息，在web环境中就无法通过快捷方式来跳转路径了，解决办法也很简单，记住windows 的链接命令：</p>
<!-- /wp:paragraph -->
<!-- wp:syntaxhighlighter/code -->
<pre class="wp-block-syntaxhighlighter-code">mklink [-J/-H] destination source
</pre>
<!-- /wp:syntaxhighlighter/code -->
<!-- wp:paragraph -->
<p>windows系统总共有四种链接方式：</p>
<!-- /wp:paragraph -->
<!-- wp:list -->
<ul><li>硬链接 -H</li><li>软链接</li><li>Junction -J</li><li>快捷方式</li></ul>
<!-- /wp:list -->
<!-- wp:paragraph -->
<p>硬链接和Linux一样，软链接只能引导文件，Junction则是windows链接目录的方法，快捷方式就是普通的shortcut文件了。</p>
<!-- /wp:paragraph -->
]]></content:encoded></item><item><title>协方差和协方差矩阵</title><link>https://www.siyuanxu.com/%E5%8D%8F%E6%96%B9%E5%B7%AE%E5%92%8C%E5%8D%8F%E6%96%B9%E5%B7%AE%E7%9F%A9%E9%98%B5/</link><pubDate>Wed, 30 Jan 2019 04:54:52 +0800</pubDate><guid>https://www.siyuanxu.com/%E5%8D%8F%E6%96%B9%E5%B7%AE%E5%92%8C%E5%8D%8F%E6%96%B9%E5%B7%AE%E7%9F%A9%E9%98%B5/</guid><description>&lt;p&gt;在随机场分析以及机器学习的 PCA 主成分分析的过程中，我经常看到协方差和协方差矩阵这两个概念。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;协方差&lt;/strong&gt;：用于衡量两个变量的总体误差，方差(variance)是协方差的一种特殊情况，即两个变量完全相同。&lt;/p&gt;</description><content:encoded><![CDATA[<p>在随机场分析以及机器学习的 PCA 主成分分析的过程中，我经常看到协方差和协方差矩阵这两个概念。</p>
<p><strong>协方差</strong>：用于衡量两个变量的总体误差，方差(variance)是协方差的一种特殊情况，即两个变量完全相同。</p>
<p>假设有两组有限实数变量 $latex X$ 和 $latex Y$，那么他们各有一阶矩（矩的概念可以看一位朋友的博文<a href="https://reasonw.github.io/blog/2017/03/06/Moment/#%E7%89%A9%E7%90%86%E6%84%8F%E4%B9%89" rel="nofollow"> moment 矩</a>）为：</p>
<p>$$ E(X)=\mu,E(Y)=\nu $$</p>
<p>那么协方差可以定义为：</p>
<p>$$ cov(X,Y)=E[(X-\mu)(Y-\nu)]=E(X\cdot Y)-\mu\nu $$</p>
<p>协方差表示的是两个变量的总体的误差，这与只表示一个变量误差的方差不同。 如果两变量的变化趋势一致，也就是说如果其中一个大于自身的期望值，另外一个也大于自身的期望值，那么两个变量之间的协方差就是正值。 如果两个变量的变化趋势相反，即其中一个大于自身的期望值，另外一个却小于自身的期望值，那么两个变量之间的协方差就是负值。</p>
<p>如果<em>X</em> 与<em>Y</em> 是统计独立的，那么二者之间的协方差就是0，这是因为：</p>
<p>$$ E(X\cdot Y)=E(X)\cdot E(Y)=\mu\nu $$</p>
<p>但是反之则不成立，如果X和Y的协方差为0，二者的独立性取决于协方差的相关性：</p>
<p>$$ \eta=\frac{cov(X,Y)}{\sqrt{var(X)\cdot var(Y)}}\ \ var(X):X的方差 $$</p>
<p>更准确的说是线性相关性，$latex \eta$ 是一个衡量线性独立的无量纲数，取值在[-1,1]之间。相关性 $latex \eta=1$ 时成为完全线性相关。</p>
<p><strong>协方差矩阵</strong>：分别为m和n个标量元素的列向量随机变量X和Y，二者对应的期望值分别为 $latex \mu, \nu$，这两个变量之间的协方差定义为$latex m\times n$矩阵</p>
<p>$$ cov(X,Y)=E((X-\mu)(Y-\nu)^T) $$</p>
]]></content:encoded></item><item><title>使用 mathjax 引擎渲染 github pages / wordpress 中的公式</title><link>https://www.siyuanxu.com/%E4%BD%BF%E7%94%A8-mathjax-%E5%BC%95%E6%93%8E%E6%B8%B2%E6%9F%93-github-pages-wordpress-%E4%B8%AD%E7%9A%84%E5%85%AC%E5%BC%8F/</link><pubDate>Fri, 30 Mar 2018 04:29:57 +0800</pubDate><guid>https://www.siyuanxu.com/%E4%BD%BF%E7%94%A8-mathjax-%E5%BC%95%E6%93%8E%E6%B8%B2%E6%9F%93-github-pages-wordpress-%E4%B8%AD%E7%9A%84%E5%85%AC%E5%BC%8F/</guid><description>&lt;p&gt;使用 GitHub pages 服务有一段时间了，体验很棒。不过在上一篇 &lt;a href="https://www.siyuanxu.com/archives/14"&gt;蒙特卡洛随机算法 101 &lt;/a&gt;的发布过程中发现，GitHub 的 markdown 语法并不支持 LaTeX 公式的渲染，所以今天晚饭后抽了几分钟时间搜索了以下解决方案，在这里分享出来。&lt;/p&gt;</description><content:encoded><![CDATA[<p>使用 GitHub pages 服务有一段时间了，体验很棒。不过在上一篇 <a href="https://www.siyuanxu.com/archives/14">蒙特卡洛随机算法 101 </a>的发布过程中发现，GitHub 的 markdown 语法并不支持 LaTeX 公式的渲染，所以今天晚饭后抽了几分钟时间搜索了以下解决方案，在这里分享出来。</p>
<p>GitHub pages 使用的时 jeklly 程序，在主题文件中是支持 js script 的。所以在博客的 repo 中找到</p>
<div class="language-bash highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>_includes/head.html
</code></pre>
</div>
</div>
然后添加
<div class="language-html highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"text/x-mathjax-config"</span><span class="nt">&gt;</span>
  <span class="nx">MathJax</span><span class="p">.</span><span class="nx">Hub</span><span class="p">.</span><span class="nx">Config</span><span class="p">({</span>
    <span class="na">extensions</span><span class="p">:</span> <span class="p">[</span><span class="dl">"</span><span class="s2">tex2jax.js</span><span class="dl">"</span><span class="p">],</span>
    <span class="na">jax</span><span class="p">:</span> <span class="p">[</span><span class="dl">"</span><span class="s2">input/TeX</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">output/HTML-CSS</span><span class="dl">"</span><span class="p">],</span>
    <span class="na">tex2jax</span><span class="p">:</span> <span class="p">{</span>
      <span class="o">&lt;!--</span><span class="nx">$</span><span class="err">表示行内元素，</span><span class="nx">$$</span><span class="err">表示块状元素</span> <span class="o">--&gt;</span>
      <span class="na">inlineMath</span><span class="p">:</span> <span class="p">[</span> <span class="p">[</span><span class="dl">'</span><span class="s1">$</span><span class="dl">'</span><span class="p">,</span><span class="dl">'</span><span class="s1">$</span><span class="dl">'</span><span class="p">],</span> <span class="p">[</span><span class="dl">"</span><span class="se">\\</span><span class="s2">(</span><span class="dl">"</span><span class="p">,</span><span class="dl">"</span><span class="se">\\</span><span class="s2">)</span><span class="dl">"</span><span class="p">]</span> <span class="p">],</span>
      <span class="na">displayMath</span><span class="p">:</span> <span class="p">[</span> <span class="p">[</span><span class="dl">'</span><span class="s1">$$</span><span class="dl">'</span><span class="p">,</span><span class="dl">'</span><span class="s1">$$</span><span class="dl">'</span><span class="p">],</span> <span class="p">[</span><span class="dl">"</span><span class="se">\\</span><span class="s2">[</span><span class="dl">"</span><span class="p">,</span><span class="dl">"</span><span class="se">\\</span><span class="s2">]</span><span class="dl">"</span><span class="p">]</span> <span class="p">],</span>
      <span class="na">processEscapes</span><span class="p">:</span> <span class="kc">true</span>
    <span class="p">},</span>
    <span class="dl">"</span><span class="s2">HTML-CSS</span><span class="dl">"</span><span class="p">:</span> <span class="p">{</span> <span class="na">availableFonts</span><span class="p">:</span> <span class="p">[</span><span class="dl">"</span><span class="s2">TeX</span><span class="dl">"</span><span class="p">]</span> <span class="p">}</span>
  <span class="p">});</span>
 <span class="nt">&lt;/script&gt;</span>
 <span class="c">&lt;!--加载MathJax的最新文件， async表示异步加载进来 --&gt;</span>
 <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">async</span> <span class="na">src=</span><span class="s">"https://cdn.mathjax.org/mathjax/latest/MathJax.js"</span><span class="nt">&gt;</span>
 <span class="nt">&lt;/script&gt;</span></code></pre>
</div>
</div>
在wordpress 中只需要安装Mathjax-Latex by Kblog的插件即可
<p>这样就可以载入一个配置好的公式渲染引擎了</p>
<p>$$ P=\sum^n_1\sigma_i+Excited!! $$</p>
]]></content:encoded></item><item><title>python 多线程并行加速 for</title><link>https://www.siyuanxu.com/python-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%B9%B6%E8%A1%8C%E5%8A%A0%E9%80%9F-for/</link><pubDate>Tue, 20 Feb 2018 04:27:57 +0800</pubDate><guid>https://www.siyuanxu.com/python-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%B9%B6%E8%A1%8C%E5%8A%A0%E9%80%9F-for/</guid><description>&lt;p&gt;在&lt;a href="https://www.siyuanxu.com/archives/14"&gt;前一篇文章&lt;/a&gt;里，我借助蒙特卡洛法对圆周率进行了估算，结果还是比较满意的，但是在试算过程中有一个问题很 annoying。更准确的结果需要更多的随机点，更多随机点意味着更大的矩阵计算，而且我在计算收敛情况时，需要多次执行求 pi 函数，但是我的 7700k 在计算时很不慌张，占有率仅在15%附近徘徊。矩阵乘法的并行加速我暂时还没有时间弄清楚，但是 for 的加速还是比较简单的，直接使用 multiprocessing 。代码如下：&lt;/p&gt;</description><content:encoded><![CDATA[<p>在<a href="https://www.siyuanxu.com/archives/14">前一篇文章</a>里，我借助蒙特卡洛法对圆周率进行了估算，结果还是比较满意的，但是在试算过程中有一个问题很 annoying。更准确的结果需要更多的随机点，更多随机点意味着更大的矩阵计算，而且我在计算收敛情况时，需要多次执行求 pi 函数，但是我的 7700k 在计算时很不慌张，占有率仅在15%附近徘徊。矩阵乘法的并行加速我暂时还没有时间弄清楚，但是 for 的加速还是比较简单的，直接使用 multiprocessing 。代码如下：</p>
<div class="language-python highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">from</span> <span class="nn">multiprocessing</span> <span class="kn">import</span> <span class="n">Pool</span> <span class="c1"># 引用线程池 </span>
<span class="k">def</span> <span class="nf">mc_pi</span><span class="p">(</span><span class="n">size</span><span class="p">):</span>
    <span class="n">ran_x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">([</span><span class="n">size</span><span class="p">,</span> <span class="n">size</span><span class="p">])</span>
    <span class="n">ran_y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">([</span><span class="n">size</span><span class="p">,</span> <span class="n">size</span><span class="p">])</span>
<pre><code>&lt;span class=&quot;n&quot;&gt;is_c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ran_x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ran_y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;is_c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;is_c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;pi&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count_nonzero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;is_c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pi&lt;/span&gt;
</code></pre>
<p><span class="k">if</span> <span class="n"><strong>name</strong></span> <span class="o">==</span> <span class="s">&rsquo;<strong>main</strong>&rsquo;</span><span class="p">:</span>
<span class="n">size</span> <span class="o">=</span> <span class="mi">2000</span>
<span class="n">sizes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<span class="n">pool</span> <span class="o">=</span> <span class="n">Pool</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span> <span class="c1"># 创建线程池，小于等于 cpu 的线程 </span>
<span class="n">    pis</span> <span class="o">=</span> <span class="n">pool</span><span class="o">.</span><span class="nb">map</span><span class="p">(</span><span class="n">mc_pi</span><span class="p">,</span> <span class="n">sizes</span><span class="p">)</span> <span class="c1"># 计算函数和传入参数的 list 或 array 返回的是计算函数的返回值 list</span></code></pre></p>
</div>
</div>
multiprocessing 的好处时显而易见的，不需要像 thread 一样对代码进行修改。面对 for 循环，直接自动 map 到多个线程中，计算效率有比较大的提升。在上面的循环中，相比常规 for，很容易跑满 cpu，计算时间减少了一多半，从10.5s降低至4.5s。
]]></content:encoded></item><item><title>蒙特卡洛算法-101 使用随机算法计算圆周率</title><link>https://www.siyuanxu.com/%E8%92%99%E7%89%B9%E5%8D%A1%E6%B4%9B%E7%AE%97%E6%B3%95-101-%E4%BD%BF%E7%94%A8%E9%9A%8F%E6%9C%BA%E7%AE%97%E6%B3%95%E8%AE%A1%E7%AE%97%E5%9C%86%E5%91%A8%E7%8E%87/</link><pubDate>Tue, 30 Jan 2018 04:14:42 +0800</pubDate><guid>https://www.siyuanxu.com/%E8%92%99%E7%89%B9%E5%8D%A1%E6%B4%9B%E7%AE%97%E6%B3%95-101-%E4%BD%BF%E7%94%A8%E9%9A%8F%E6%9C%BA%E7%AE%97%E6%B3%95%E8%AE%A1%E7%AE%97%E5%9C%86%E5%91%A8%E7%8E%87/</guid><description>&lt;p&gt;随机算法在解决复杂问题时可以用极少的计算成本得到近似解析解的结果。今年，在国内岩土届，随机算法也有大量的应用，例如可靠度分析以及随机有限元方面。&lt;/p&gt;</description><content:encoded><![CDATA[<p>随机算法在解决复杂问题时可以用极少的计算成本得到近似解析解的结果。今年，在国内岩土届，随机算法也有大量的应用，例如可靠度分析以及随机有限元方面。</p>
<p>蒙特卡洛法是一种应用相当广泛的随机算法，近代的随机有限元也是建立在此基础上的。今天笔者第一次接触 mc 算法，尝试计算了圆周率，得到了不错的结果。</p>
<h2 id="想法">想法</h2>
假设我们有一个正方形， 在正方形中有一圆形，为了简化表达，这里的圆是正方形的内切圆，两图形的位置如下：
图形是关于原点中心对称的，因此，我们着重关心第一象限的内容。蒙特卡罗方法基于这样的思想：假想你有一袋豆子，把豆子均匀地朝这个图形上撒，然后数这个图形之中有多少颗豆子，这个豆子的数目就是图形的面积。当你的豆子越小，撒的越多的时候，结果就越精确。借助计算机程序可以生成大量均匀分布坐标点，然后统计出图形内的点数，通过它们占总点数的比例和坐标点生成范围的面积就可以求出图形面积。
<p>假如我们在正方形的内随机加入100个点，如下图，那么一般会有较多的点落在圆内，较少的点落在圆外。这时</p>
<p>那么随着我们点数的增加，随机点将会逐渐铺满整个面，那么相应的结果的准确率也会越来越高。下图是覆盖了10000个随机点的示意图。</p>
<p>在这一逼近过程中，收敛速度很快，我分别计算了从 100~<span id="MathJax-Element-1-Frame" class="MathJax" tabindex="0"><span id="MathJax-Span-1" class="math"><span id="MathJax-Span-2" class="mrow"><span id="MathJax-Span-3" class="mn">2</span><span id="MathJax-Span-4" class="mo">×</span><span id="MathJax-Span-5" class="msubsup"><span id="MathJax-Span-6" class="mn">10</span><span id="MathJax-Span-7" class="mn">6</span></span></span></span></span> 个随机点的pi值，收敛情况如下表右图，最后一次计算得到的结果为 3.1431953738541956 。nicoguaro 使用蒙特卡罗方法估算π值，见下表左图. 放置30000个随机点后,π的估算值与真实值相差 0.07%。</p>
<div class="table-responsive">
<table class="table">
<thead>
<tr>
<th>计算过程</th>
<th>收敛过程</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</div>
计算过程：由nicoguaro - 自己的作品，CC BY 3.0，https://commons.wikimedia.org/w/index.php?curid=14609430
<p>但是，也不难看出，虽然蒙特卡洛法计算效率非常高，但是由于其基于随机，所以极难达到很高的精度，即使取10的9次方个随机点时，其结果也仅在前4位与圆周率吻合）。用蒙特卡罗方法近似计算圆周率的先天不足是：第一，计算机产生的随机数是受到存储格式的限制的，是离散的，并不能产生连续的任意实数；上述做法将平面分区成一个个网格，在空间也不是连续的，由此计算出来的面积当然与圆或多或少有差距。所以，这种随机算法在应用时也应进行一定的适用性考虑。</p>
<p>最后 ，附计算代码如下：</p>
<div class="language-python highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<p><span class="k">def</span> <span class="nf">mc_pi</span><span class="p">(</span><span class="n">size</span><span class="p">):</span>
<span class="n">ran_x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">([</span><span class="n">size</span><span class="p">,</span> <span class="n">size</span><span class="p">])</span>
<span class="n">ran_y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">([</span><span class="n">size</span><span class="p">,</span> <span class="n">size</span><span class="p">])</span></p>
<pre><code>&lt;span class=&quot;n&quot;&gt;is_c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ran_x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ran_y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;is_c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;is_c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;pi&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;np&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count_nonzero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;is_c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pi&lt;/span&gt;
</code></pre>
<p><span class="k">if</span> <span class="n"><strong>name</strong></span> <span class="o">==</span> <span class="s">&rsquo;<strong>main</strong>&rsquo;</span><span class="p">:</span>
<span class="n">size</span> <span class="o">=</span> <span class="mi">2000</span>
<span class="n">sizes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<span class="n">pool</span> <span class="o">=</span> <span class="n">Pool</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span>
<span class="n">pis</span> <span class="o">=</span> <span class="n">pool</span><span class="o">.</span><span class="nb">map</span><span class="p">(</span><span class="n">mc_pi</span><span class="p">,</span> <span class="n">sizes</span><span class="o">.</span><span class="n">tolist</span><span class="p">())</span></code></pre></p>
</div>
</div>
]]></content:encoded></item><item><title>Github pages build failure</title><link>https://www.siyuanxu.com/github-pages-build-failure/</link><pubDate>Mon, 15 Jan 2018 04:13:26 +0800</pubDate><guid>https://www.siyuanxu.com/github-pages-build-failure/</guid><description>&lt;p&gt;File is not properly UTF-8 encoded? 也许这里可以帮到你&lt;/p&gt;
&lt;p&gt;Github pages 绝对是一项超值服务，如果没有动态网页要求的话，已经可以把这项服务当做一个不错的网站虚拟机了。很多托管在 github 上的优秀的项目都会建立一个相应的 github pages 页面。具体的建立流程十分简单，笔者就不在此赘述了。今天给大家分享一个 buil failure 问题的解决方法。&lt;/p&gt;</description><content:encoded><![CDATA[<p>File is not properly UTF-8 encoded? 也许这里可以帮到你</p>
<p>Github pages 绝对是一项超值服务，如果没有动态网页要求的话，已经可以把这项服务当做一个不错的网站虚拟机了。很多托管在 github 上的优秀的项目都会建立一个相应的 github pages 页面。具体的建立流程十分简单，笔者就不在此赘述了。今天给大家分享一个 buil failure 问题的解决方法。</p>
<p>这几天对一些国内免费的开源 api 很感兴趣，建了一个 repo <a href="http://github.com/siyuanxu/toys">http://github.com/siyuanxu/toys</a> 。大体上就是用 python 聚合一些信息写成 markdown 文件，并使用 github pages 做一个简单的静态页面。项目很简单，pages 上线也很顺利，但是上午在办公室更新了一下数据，竟然收到了 github 发的 build failure 邮件，提示内容是 File is not properly UTF-8 encoded。想了一下原因应该是办公室的 windows 系统中输出文本的编码有问题，而私人用的 MacBook 则没有此问题。在网上搜了一下，有一个解决办法是使用 iconv.exe 来进行转码，大体如下：</p>
<div class="language-bash highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>iconv <span class="nt">-f</span> GBK <span class="nt">-t</span> utf-8 origin.md <span class="o">&gt;</span> new.md
</code></pre>
</div>
</div>
但是试了之后疗效并不好，当然有可能是因为我原来的文件并不是 GBK，而且这个方法不太 python。所以还是想在 python 中进行修改。简单搜索后有方法如下：
<p>原来的文本写操作为</p>
<div class="language-python highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s">'index.md'</span><span class="p">,</span><span class="s">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
	<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
</code></pre>
</div>
</div>
修改后为
<div class="language-python highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="kn">import</span> <span class="nn">codecs</span>
<p><span class="k">with</span> <span class="n">codecs</span><span class="o">.</span><span class="nb">open</span><span class="p">(</span><span class="s">&lsquo;index.md&rsquo;</span><span class="p">,</span><span class="s">&lsquo;w&rsquo;</span><span class="p">,</span><span class="s">&lsquo;utf-8&rsquo;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">blah</span> <span class="n">blah</span> <span class="n">blah</span>
</code></pre></p>
</div>
</div>
codes 是 python 的自带库，经过 codecs 内部函数操作的文本可以对编码格式进行指定。经过这样修改后，在此运行代码并提交至 github，build 成功。
]]></content:encoded></item><item><title>如何优雅的配置 ssh-key 登录远程 Linux 服务器 //ssh-copy-id excited！</title><link>https://www.siyuanxu.com/%E5%A6%82%E4%BD%95%E4%BC%98%E9%9B%85%E7%9A%84%E9%85%8D%E7%BD%AE-ssh-key-%E7%99%BB%E5%BD%95%E8%BF%9C%E7%A8%8B-linux-%E6%9C%8D%E5%8A%A1%E5%99%A8-ssh-copy-id-excited/</link><pubDate>Fri, 05 Jan 2018 04:05:08 +0800</pubDate><guid>https://www.siyuanxu.com/%E5%A6%82%E4%BD%95%E4%BC%98%E9%9B%85%E7%9A%84%E9%85%8D%E7%BD%AE-ssh-key-%E7%99%BB%E5%BD%95%E8%BF%9C%E7%A8%8B-linux-%E6%9C%8D%E5%8A%A1%E5%99%A8-ssh-copy-id-excited/</guid><description>&lt;p&gt;笔者手上有国内外小鸡若干，如果采用密码登录服务器。在远程登录服务器以及在有服务器端–本地段拷贝需求时，频繁的密码输入过程略显繁琐。所以在本地机器相对固定时，ssh-key 登录方式非常方便。在配置好 ssh-key 之后，我们登录服务器或者执行 scp 操作都不需要在此输入密码了。&lt;/p&gt;</description><content:encoded><![CDATA[<p>笔者手上有国内外小鸡若干，如果采用密码登录服务器。在远程登录服务器以及在有服务器端–本地段拷贝需求时，频繁的密码输入过程略显繁琐。所以在本地机器相对固定时，ssh-key 登录方式非常方便。在配置好 ssh-key 之后，我们登录服务器或者执行 scp 操作都不需要在此输入密码了。</p>
<p>可能你对 ssh-key 不是很了解，但是如果你使用 github，你其实已经在使用 ssh-key 的方式简化了远程操作步骤了。不管你的平台的是 Mac还是 Linux 的各种发行版，在你使用 ssh 隧道时，都需要一个 .ssh 文件夹。一般情况下，该文件夹的内容如下：</p>
<ul>
 	<li>id_rsa 文件，私钥</li>
 	<li>id_rsa.pub 公钥，是向互联网公开的</li>
 	<li>Know_hosts 用户使用过的 host 信息</li>
 	<li>authorized_keys 存放其他主机公钥的地方，和 GitHub 中管理 keys 的页面一样的道理</li>
</ul>
当然，你可以不必在意这些文件如何如何。配置 ssh-key 只需要在本地机上执行简单的两个步骤
<h2 id="1-生成-key">1 生成 key</h2>
这一步是在你面前的本地机上操作的，只需要执行下面这条命令：
<div class="language-bash highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>ssh-keygen <span class="nt">-t</span> rsa
</code></pre>
</div>
</div>
意思是生成一个 -t type 为 rsa 加密的 ssh-keygen
<h2 id="2-传到远端">2 传到远端</h2>
网上很多资料中这一步使用的是 scp 来复制文件，但是这样有很多弊端，比如你的文件权限很可能不正确。在这里我们使用一条非常优雅的命令来完成这一操作;
<pre><code class="language-Bash">ssh-copy-id server_user_name@server.com
</code></pre>
在输入服务器登录密码后，ssh-key 登录就已经配置完成了。绝对不会出现任何碰壁的现象。
<h2 id="3-more">3 more</h2>
现在我们在登录远程服务器时已经不需要输入密码了，如果你想更加简化，还可以使用 alias 赋予登录命令别名。编辑 .bashrc 或者 .bash_profile 文件，添加别名。
<div class="language-bash highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="nb">alias </span><span class="nv">ecs1</span><span class="o">=</span><span class="s1">'ssh user@server.com'</span>
</code></pre>
</div>
</div>
修改后再运行下面的命令使设置生效
<pre><code class="language-Bash">source .bash_profile
</code></pre>
这样，只需要输入 ecs1 就可以登录到远程服务器了。
]]></content:encoded></item><item><title>matplotlib 的动态绘图实现</title><link>https://www.siyuanxu.com/matplotlib-%E7%9A%84%E5%8A%A8%E6%80%81%E7%BB%98%E5%9B%BE%E5%AE%9E%E7%8E%B0/</link><pubDate>Mon, 04 Dec 2017 23:09:56 +0800</pubDate><guid>https://www.siyuanxu.com/matplotlib-%E7%9A%84%E5%8A%A8%E6%80%81%E7%BB%98%E5%9B%BE%E5%AE%9E%E7%8E%B0/</guid><description>&lt;p&gt;笔者在日常的研究中经常使用 matplotlib 进行数据后处理，这个库的自由度很高，在 seaborn 加持下的出图质量也很高，在处理大量的试验数据时，Python 的应用节省了大量的时间。&lt;/p&gt;</description><content:encoded><![CDATA[<p>笔者在日常的研究中经常使用 matplotlib 进行数据后处理，这个库的自由度很高，在 seaborn 加持下的出图质量也很高，在处理大量的试验数据时，Python 的应用节省了大量的时间。</p>
<p>最近笔者在进行两个项目，一个是自己开发的数据采集仪<a href="https://github.com/siyuanxu/arduino_analog_sensor">有兴趣请戳 github</a>，还有一个是岩土方面的离散元数值分析研究（还没出结果，发过 paper 后开源）。在这两个项目中，经常会有对动态数组实时绘图的需求，在查阅资料后整理出了一种比较简便的方法，现在分享一下过程中的错误和最终成功的示例。</p>
<h3 id="naive-code">Naive code：</h3>
最初我非常的 naive，思路如下：
<div class="language-python highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="n">plt</span><span class="o">.</span><span class="n">ion</span><span class="p">()</span> <span class="c1"># interactive mode on 
</span><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">)</span> <span class="c1"># plot original data 
</span><span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span> <span class="c1"># show the plot 
</span><span class="k">while</span> <span class="n">condition</span><span class="p">:</span> <span class="c1"># loop </span>
<span class="n">    x</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">new_x</span><span class="p">)</span>
<span class="n">    y</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">new_y</span><span class="p">)</span> <span class="c1"># append new data point
</span>    <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">)</span> <span class="c1"># replot data </span>
<span class="n">    plt</span><span class="o">.</span><span class="n">pause</span><span class="p">(</span><span class="mf">1e-5</span><span class="p">)</span> <span class="c1"># pause the plot to show</span></code></pre>
</div>
</div>
这种方法在数据量较少，比如全部数据点不超过200个的时候，也可以实现“动态绘图”。但是当数据量较大时，绘图窗口会有严重的卡顿，而且曲线的绘制也有较大的延迟。采集仪项目中，当数据点超过400时，绘图相比于实际电位器的变化已经迟滞了三秒以上。
<p>在查明原因之后，笔者才发现自己写了一段尬 code，这样绘制出的曲线，虽然看起来是一条变化的曲线，但实际上是在每次更新数据之后进行了重复绘制，如果数据总共有 n 个数据点，那么最终将绘制 n 条不断重叠的曲线，难怪界面卡顿那么严重。</p>
<p>那么针对重叠绘图的问题，笔者又尬了一句 plt.clf() 在循环开始的位置。</p>
<div class="language-python highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="n">plt</span><span class="o">.</span><span class="n">ion</span><span class="p">()</span> <span class="c1"># interactive mode on 
</span><span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">)</span> <span class="c1"># plot original data 
</span><span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span> <span class="c1"># show the plot 
</span><span class="k">while</span> <span class="n">condition</span><span class="p">:</span> <span class="c1"># loop 
</span>    plt.clf()
<span class="n">    x</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">new_x</span><span class="p">)</span>
<span class="n">    y</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">new_y</span><span class="p">)</span> <span class="c1"># append new data point
</span>    <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">)</span> <span class="c1"># replot data </span>
<span class="n">    plt</span><span class="o">.</span><span class="n">pause</span><span class="p">(</span><span class="mf">1e-5</span><span class="p">)</span> <span class="c1"># pause the plot to show</span></code></pre>
</div>
</div>
在每次重绘之前，删除当前 plot， 这样一来就不会产生重叠曲线了。但是这仍然是一个错误的示范，因为整个 plot 会在每次更新数据的时候闪现，体验很糟糕。
<h3 id="exited-code">Exited code：</h3>
通过笔者仔细的钻（stack）研（overflow），最终找到了正确的解决方法，其思路是避免重绘，采用数据更新的方法绘图。代码如下：
<div class="language-python highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<p><span class="n">plt</span><span class="o">.</span><span class="n">ion</span><span class="p">()</span> <span class="c1"># interactive mode on 
</span><span class="n">line</span><span class="p">,</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">)</span> <span class="c1"># plot the data and specify the 2d line 
</span><span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">gca</span><span class="p">()</span> <span class="c1"># get most of the figure elements </span>
<span class="k">while</span> <span class="n">condition</span><span class="p">:</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">new_x</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">new_y</span><span class="p">)</span>
<span class="n">line</span><span class="o">.</span><span class="n">set_xdata</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="n">line</span><span class="o">.</span><span class="n">set_ydata</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="c1"># set the curve with new data </span>
<span class="n">    ax</span><span class="o">.</span><span class="n">relim</span><span class="p">()</span> <span class="c1"># renew the data limits </span>
<span class="n">    ax</span><span class="o">.</span><span class="n">autoscale_view</span><span class="p">(</span><span class="bp">True</span><span class="p">,</span> <span class="bp">True</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span> <span class="c1"># rescale plot view </span>
<span class="n">    plt</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span> <span class="c1"># plot new figure
</span>    <span class="n">plt</span><span class="o">.</span><span class="n">pause</span><span class="p">(</span><span class="mf">1e-17</span><span class="p">)</span> <span class="c1"># pause to show the figure</span></code></pre></p>
</div>
</div>
现在，通过上面的代码便可以得到实时更新的，效率较高的动态绘图结果。
]]></content:encoded></item></channel></rss>