Skip to content

Instantly share code, notes, and snippets.

@shotahorii
Created April 23, 2019 17:08
Show Gist options
  • Save shotahorii/19aaff3302ef6dfe477ba3c1652b2532 to your computer and use it in GitHub Desktop.
Save shotahorii/19aaff3302ef6dfe477ba3c1652b2532 to your computer and use it in GitHub Desktop.
Vector and Matrix Operations
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Vector and Matrix Operation\n",
"- 「これなら分かる最適化数学」(金谷健一) 第1章 数学的準備\n",
"- [転置行列の定理](https://www.iwanttobeacat.com/entry/2018/01/05/220317)\n",
"- [ベクトルの微分](https://www.iwanttobeacat.com/entry/2018/01/08/220932)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**曲線の法線ベクトルと接線の求め方**"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"<b>法線ベクトルの求め方</b><br>\n",
"曲線$$f(x,y)=0$$の点$$(\\overline{x},\\overline{y})$$における法線ベクトルは以下である。\n",
"<br><br>\n",
"$$\\nabla \\overline{f} = \n",
"(\\frac{\\partial \\overline{f}}{\\partial x}, \\frac{\\partial \\overline{f}}{\\partial y})^T$$\n",
"<br><br>\n",
"ここで、$$\\frac{\\partial \\overline{f}}{\\partial x}$$は$$f(x,y)$$を$$x$$で偏微分して\n",
"$$(\\overline{x},\\overline{y})$$を代入した値である。"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"<b>法線ベクトルの求め方</b><br>\n",
"曲線$$f(x,y)=0$$の点$$(\\overline{x},\\overline{y})$$における法線ベクトルは以下である。\n",
"<br><br>\n",
"$$\\nabla \\overline{f} = \n",
"(\\frac{\\partial \\overline{f}}{\\partial x}, \\frac{\\partial \\overline{f}}{\\partial y})^T$$\n",
"<br><br>\n",
"ここで、$$\\frac{\\partial \\overline{f}}{\\partial x}$$は$$f(x,y)$$を$$x$$で偏微分して\n",
"$$(\\overline{x},\\overline{y})$$を代入した値である。"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"<b>接線の求め方</b><br>\n",
"次に、この点における接線を求めたい。上で求めた法線ベクトルは、点$$(\\overline{x},\\overline{y})$$\n",
"において曲線$$f(x,y)=0$$に直交するものなので、この点での曲線$$f(x,y)=0$$の接線は\n",
"この法線ベクトルに直交する直線でかつ点$$(\\overline{x},\\overline{y})$$を通るもの、を求めればよい。<br>\n",
"ここで、この直線を仮に以下のように置く。\n",
"<br><br>\n",
"$$Ax+By+C = 0$$\n",
"<br><br>\n",
"この直線が\n",
"$$\\nabla \\overline{f} = \n",
"(\\frac{\\partial \\overline{f}}{\\partial x}, \\frac{\\partial \\overline{f}}{\\partial y})^T$$\n",
"を法線ベクトルとして持つためには、$$x$$による偏微分が$$\\frac{\\partial \\overline{f}}{\\partial x}$$,\n",
"yによる偏微分が$$\\frac{\\partial \\overline{f}}{\\partial y}$$である必要がある。つまり以下である。\n",
"<br><br>\n",
"$$A = \\frac{\\partial \\overline{f}}{\\partial x}$$<br>\n",
"$$B = \\frac{\\partial \\overline{f}}{\\partial y}$$\n",
"<br><br>\n",
"また、点$$(\\overline{x},\\overline{y})$$を通る必要があるので、$$C$$は以下となる。\n",
"<br><br>\n",
"$$C = -(A \\overline{x} + B \\overline{y})$$\n",
"<br><br>\n",
"つまり、この直線、すなわち点$$(\\overline{x},\\overline{y})$$における曲線$$f(x,y)=0$$\n",
"の接線は以下である。\n",
"<br><br>\n",
"$$\\frac{\\partial \\overline{f}}{\\partial x} x + \\frac{\\partial \\overline{f}}{\\partial y} y - \n",
"(\\frac{\\partial \\overline{f}}{\\partial x} \\overline{x} + \n",
" \\frac{\\partial \\overline{f}}{\\partial y} \\overline{y}) = 0$$<br>\n",
"整理して、<br>\n",
"$$\\frac{\\partial \\overline{f}}{\\partial x} (x - \\overline{x}) + \n",
" \\frac{\\partial \\overline{f}}{\\partial y} (y - \\overline{y}) = 0$$"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"<b>接線の求め方</b><br>\n",
"次に、この点における接線を求めたい。上で求めた法線ベクトルは、点$$(\\overline{x},\\overline{y})$$\n",
"において曲線$$f(x,y)=0$$に直交するものなので、この点での曲線$$f(x,y)=0$$の接線は\n",
"この法線ベクトルに直交する直線でかつ点$$(\\overline{x},\\overline{y})$$を通るもの、を求めればよい。<br>\n",
"ここで、この直線を仮に以下のように置く。\n",
"<br><br>\n",
"$$Ax+By+C = 0$$\n",
"<br><br>\n",
"この直線が\n",
"$$\\nabla \\overline{f} = \n",
"(\\frac{\\partial \\overline{f}}{\\partial x}, \\frac{\\partial \\overline{f}}{\\partial y})^T$$\n",
"を法線ベクトルとして持つためには、$$x$$による偏微分が$$\\frac{\\partial \\overline{f}}{\\partial x}$$,\n",
"yによる偏微分が$$\\frac{\\partial \\overline{f}}{\\partial y}$$である必要がある。つまり以下である。\n",
"<br><br>\n",
"$$A = \\frac{\\partial \\overline{f}}{\\partial x}$$<br>\n",
"$$B = \\frac{\\partial \\overline{f}}{\\partial y}$$\n",
"<br><br>\n",
"また、点$$(\\overline{x},\\overline{y})$$を通る必要があるので、$$C$$は以下となる。\n",
"<br><br>\n",
"$$C = -(A \\overline{x} + B \\overline{y})$$\n",
"<br><br>\n",
"つまり、この直線、すなわち点$$(\\overline{x},\\overline{y})$$における曲線$$f(x,y)=0$$\n",
"の接線は以下である。\n",
"<br><br>\n",
"$$\\frac{\\partial \\overline{f}}{\\partial x} x + \\frac{\\partial \\overline{f}}{\\partial y} y - \n",
"(\\frac{\\partial \\overline{f}}{\\partial x} \\overline{x} + \n",
" \\frac{\\partial \\overline{f}}{\\partial y} \\overline{y}) = 0$$<br>\n",
"整理して、<br>\n",
"$$\\frac{\\partial \\overline{f}}{\\partial x} (x - \\overline{x}) + \n",
" \\frac{\\partial \\overline{f}}{\\partial y} (y - \\overline{y}) = 0$$\n"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"<b>曲面の法線ベクトルと接平面</b><br>\n",
"上記の定理は、曲面$$f(x,y,z)=0$$を考えても同様である。<br>\n",
"曲面$$f(x,y,z)=0$$の点$$(\\overline{x},\\overline{y},\\overline{z})$$における法線ベクトルは以下である。\n",
"<br><br>\n",
"$$\\nabla \\overline{f} = \n",
"(\\frac{\\partial \\overline{f}}{\\partial x}, \\frac{\\partial \\overline{f}}{\\partial y}, \n",
" \\frac{\\partial \\overline{f}}{\\partial z})^T$$\n",
"<br><br>\n",
"また、点$$(\\overline{x},\\overline{y},\\overline{z})$$における曲面$$f(x,y,z)=0$$\n",
"の接平面は以下で表される。\n",
"<br><br>\n",
"$$\\frac{\\partial \\overline{f}}{\\partial x} (x - \\overline{x}) + \n",
" \\frac{\\partial \\overline{f}}{\\partial y} (y - \\overline{y}) +\n",
" \\frac{\\partial \\overline{f}}{\\partial z} (z - \\overline{z}) = 0$$"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex \n",
"<b>曲面の法線ベクトルと接平面</b><br>\n",
"上記の定理は、曲面$$f(x,y,z)=0$$を考えても同様である。<br>\n",
"曲面$$f(x,y,z)=0$$の点$$(\\overline{x},\\overline{y},\\overline{z})$$における法線ベクトルは以下である。\n",
"<br><br>\n",
"$$\\nabla \\overline{f} = \n",
"(\\frac{\\partial \\overline{f}}{\\partial x}, \\frac{\\partial \\overline{f}}{\\partial y}, \n",
" \\frac{\\partial \\overline{f}}{\\partial z})^T$$\n",
"<br><br>\n",
"また、点$$(\\overline{x},\\overline{y},\\overline{z})$$における曲面$$f(x,y,z)=0$$\n",
"の接平面は以下で表される。\n",
"<br><br>\n",
"$$\\frac{\\partial \\overline{f}}{\\partial x} (x - \\overline{x}) + \n",
" \\frac{\\partial \\overline{f}}{\\partial y} (y - \\overline{y}) +\n",
" \\frac{\\partial \\overline{f}}{\\partial z} (z - \\overline{z}) = 0$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**一次形式と二次形式 - 関数による表現とベクトル表現** "
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"<b>一次形式</b><br>\n",
"$$n$$変数$$x_1,x_2,...,x_n$$の一次形式は以下のように表される。\n",
"<br><br>\n",
"$$f = a_1x_1 + a_2x_2 + ... + a_nx_n = \\sum_{i=1}^n a_ix_i$$\n",
"<br><br>\n",
"ベクトル$${\\bf a}, {\\bf x}$$を以下のように置くと、\n",
"<br><br>\n",
"$${\\bf a} = (a_1,a_2,...,a_n)^T$$<br>\n",
"$${\\bf x} = (x_1,x_2,...,x_n)^T$$\n",
"<br><br>\n",
"この一次形式はベクトルの内積として次のように書ける。\n",
"<br><br>\n",
"$$f = ({\\bf a}, {\\bf x})$$\n",
"<br><br>\n",
"また、以下のようにも表すことができる。\n",
"<br><br>\n",
"$$f = {\\bf a}^T {\\bf x}$$\n",
"<br><br>\n",
"ちなみに、ベクトルとベクトルの内積なので以下が成り立つ。(結果がスカラーなので当然だが。)\n",
"<br><br>\n",
"$${\\bf a}^T {\\bf x} = {\\bf x}^T {\\bf a}$$"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"<b>一次形式</b><br>\n",
"変数の一次の項のみからなる式を一次形式と呼ぶ\n",
"(ちなみに、変数の一次以下の項、すなわち一次および定数からなる式を一次式と呼ぶ)。<br>\n",
"$$n$$変数$$x_1,x_2,...,x_n$$の一次形式は以下のように表される。\n",
"<br><br>\n",
"$$f = a_1x_1 + a_2x_2 + ... + a_nx_n = \\sum_{i=1}^n a_ix_i$$\n",
"<br><br>\n",
"ベクトル$${\\bf a}, {\\bf x}$$を以下のように置くと、\n",
"<br><br>\n",
"$${\\bf a} = (a_1,a_2,...,a_n)^T$$<br>\n",
"$${\\bf x} = (x_1,x_2,...,x_n)^T$$\n",
"<br><br>\n",
"この一次形式はベクトルの内積として次のように書ける。\n",
"<br><br>\n",
"$$f = ({\\bf a}, {\\bf x})$$\n",
"<br><br>\n",
"また、以下のようにも表すことができる。\n",
"<br><br>\n",
"$$f = {\\bf a}^T {\\bf x}$$\n",
"<br><br>\n",
"ちなみに、ベクトルとベクトルの内積なので以下が成り立つ。(結果がスカラーなので当然だが。)\n",
"<br><br>\n",
"$${\\bf a}^T {\\bf x} = {\\bf x}^T {\\bf a}$$"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"<b>一次形式の微分</b><br>\n",
"上の一次形式の式を各$$x_i$$で偏微分すると、$$i=1,...,n$$について以下となる。\n",
"<br><br>\n",
"$$\\frac{\\partial f}{\\partial x_i} = a_i$$\n",
"<br><br>\n",
"すなわち、ベクトル$$\\nabla f$$を以下のように定義すると、\n",
"<br><br>\n",
"$$\\nabla f = (\\frac{\\partial f}{\\partial x_1},...,\\frac{\\partial f}{\\partial x_n})^T$$\n",
"<br><br>\n",
"一次形式の微分は以下となる。\n",
"<br><br>\n",
"$$\\nabla f = \\nabla ({\\bf a}, {\\bf x}) = \\nabla {\\bf a}^T {\\bf x} = {\\bf a}$$\n",
"<br><br>\n",
"これは機械学習の文脈で、$${\\bf w}^T {\\bf x}$$を$${\\bf x}$$で微分する、というような形ででてきたりする。"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"<b>一次形式の微分</b><br>\n",
"上の一次形式の式を各$$x_i$$で偏微分すると、$$i=1,...,n$$について以下となる。\n",
"<br><br>\n",
"$$\\frac{\\partial f}{\\partial x_i} = a_i$$\n",
"<br><br>\n",
"すなわち、ベクトル$$\\nabla f$$を以下のように定義すると、\n",
"<br><br>\n",
"$$\\nabla f = (\\frac{\\partial f}{\\partial x_1},...,\\frac{\\partial f}{\\partial x_n})^T$$\n",
"<br><br>\n",
"一次形式の微分は以下となる。\n",
"<br><br>\n",
"$$\\nabla f = \\nabla ({\\bf a}, {\\bf x}) = \\nabla {\\bf a}^T {\\bf x} = {\\bf a}$$\n",
"<br><br>\n",
"これは機械学習の文脈で、$${\\bf w}^T {\\bf x}$$を$${\\bf x}$$で微分する、というような形ででてきたりする。"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"<b>二次形式</b><br>\n",
"変数の二次の項のみからなる式を二次形式と呼ぶ\n",
"(ちなみに、変数の二次以下の項からなる式を二次式と呼ぶ)。<br>\n",
"$$n$$変数$$x_1,x_2,...,x_n$$の二次形式は以下のように表される。\n",
"<br><br>\n",
"$$f = a_{11}x_1^2 + a_{12}x_1x_2 + ... + a_{1n}x_1x_n$$<br>\n",
"$$+ a_{21}x_2x_1 + a_{22}x_2^2 + ... + a_{2n}x_2x_n$$<br>\n",
"$$+ ...$$<br>\n",
"$$+ a_{n1}x_nx_1 + a_{n2}x_nx_2 + ... + a_{nn}x_n^2$$<br>\n",
"$$= \\sum_{i=1}^n\\sum_{j=1}^n a_{ij}x_ix_j$$\n",
"<br><br>\n",
"ここで、行列$${\\bf A}$$とベクトル$${\\bf x}$$を、\n",
"<br><br>\n",
"$$\n",
" {\\bf A} = \\left(\n",
" \\begin{array}{ccc}\n",
" a_{11} & a_{12} & ... & a_{1n} \\\\\n",
" a_{21} & a_{22} & ... & a_{2n} \\\\\n",
" ... & ... & ... & ... \\\\\n",
" a_{n1} & a_{n2} & ... & a_{nn} \\\\\n",
" \\end{array}\n",
" \\right)\n",
"$$<br>\n",
"$${\\bf x} = (x_1,x_2,...,x_n)^T$$\n",
"<br><br>\n",
"とおくと、二次形式は以下のようなベクトルの内積として表すことができる。\n",
"<br><br>\n",
"$$f = ({\\bf x},{\\bf A}{\\bf x}) = {\\bf x}^T{\\bf A}{\\bf x}$$\n",
"<br><br>\n",
"この行列$${\\bf A}$$を二次形式$$f$$の係数行列と呼ぶ。"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"<b>二次形式</b><br>\n",
"変数の二次の項のみからなる式を二次形式と呼ぶ\n",
"(ちなみに、変数の二次以下の項からなる式を二次式と呼ぶ)。<br>\n",
"$$n$$変数$$x_1,x_2,...,x_n$$の二次形式は以下のように表される。\n",
"<br><br>\n",
"$$f = a_{11}x_1^2 + a_{12}x_1x_2 + ... + a_{1n}x_1x_n$$<br>\n",
"$$+ a_{21}x_2x_1 + a_{22}x_2^2 + ... + a_{2n}x_2x_n$$<br>\n",
"$$+ ...$$<br>\n",
"$$+ a_{n1}x_nx_1 + a_{n2}x_nx_2 + ... + a_{nn}x_n^2$$<br>\n",
"$$= \\sum_{i=1}^n\\sum_{j=1}^n a_{ij}x_ix_j$$\n",
"<br><br>\n",
"ここで、行列$${\\bf A}$$とベクトル$${\\bf x}$$を、\n",
"<br><br>\n",
"$$\n",
" {\\bf A} = \\left(\n",
" \\begin{array}{ccc}\n",
" a_{11} & a_{12} & ... & a_{1n} \\\\\n",
" a_{21} & a_{22} & ... & a_{2n} \\\\\n",
" ... & ... & ... & ... \\\\\n",
" a_{n1} & a_{n2} & ... & a_{nn} \\\\\n",
" \\end{array}\n",
" \\right)\n",
"$$<br>\n",
"$${\\bf x} = (x_1,x_2,...,x_n)^T$$\n",
"<br><br>\n",
"とおくと、二次形式は以下のようなベクトルの内積として表すことができる。\n",
"<br><br>\n",
"$$f = ({\\bf x},{\\bf A}{\\bf x}) = {\\bf x}^T{\\bf A}{\\bf x}$$\n",
"<br><br>\n",
"この行列$${\\bf A}$$を二次形式$$f$$の係数行列と呼ぶ。"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"<b>二次形式の微分</b><br>\n",
"一次形式の場合と同様、二次形式の式を各$$x_i$$で偏微分していく。<br>\n",
"例えば、$$x_1$$で偏微分する場合を考える。式の中で、$$x_1$$を含む項は以下である。\n",
"<br><br>\n",
"$$a_{11}x_1^2 + a_{12}x_1x_2 + ... + a_{1n}x_1x_n$$<br> \n",
"$$+ a_{21}x_2x_1 + a_{31}x_3x_1 + ... + a_{n1}x_nx_1$$\n",
"<br><br> \n",
"これを微分すると以下となる。\n",
"<br><br>\n",
"$$2a_{11}x_1 + a_{12}x_2 + ... + a_{1n}x_n + a_{21}x_2 + a_{31}x_3 + ... + a_{n1}x_n$$<br>\n",
"$$= \\{a_{11}x_1 + a_{12}x_2 + ... + a_{1n}x_n\\} + \\{a_{11}x_1 + a_{21}x_2 + ... + a_{n1}x_n\\}$$\n",
"<br>\n",
"$$= \\sum_{j=1}^n a_{1j}x_j + \\sum_{k=1}^n a_{k1}x_k$$\n",
"<br><br>\n",
"他の変数についても同様であるため、一般化して以下のように書ける。\n",
"<br><br>\n",
"$$\\frac{\\partial f}{\\partial x_i} = \\sum_{j=1}^n a_{ij}x_j + \\sum_{k=1}^n a_{ki}x_k$$\n",
"<br><br>\n",
"ここで、一次形式の時同様ベクトル$$\\nabla f$$を以下のように定義すると、\n",
"<br><br>\n",
"$$\\nabla f = (\\frac{\\partial f}{\\partial x_1},...,\\frac{\\partial f}{\\partial x_n})^T$$\n",
"<br><br>\n",
"これは以下のように書き換えられる。\n",
"<br><br>\n",
"$$\\nabla f = (\\sum_{j=1}^n a_{1j}x_j + \\sum_{k=1}^n a_{k1}x_k, ..., \n",
" \\sum_{j=1}^n a_{nj}x_j + \\sum_{k=1}^n a_{kn}x_k)^T$$\n",
"<br><br>\n",
"これは先に定義した$${\\bf A}, {\\bf x}$$を用いて表すと以下である。\n",
"<br><br>\n",
"$$\\nabla f = ({\\bf A}+{\\bf A}^T){\\bf x}$$"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"<b>二次形式の微分</b><br>\n",
"一次形式の場合と同様、二次形式の式を各$$x_i$$で偏微分していく。<br>\n",
"例えば、$$x_1$$で偏微分する場合を考える。式の中で、$$x_1$$を含む項は以下である。\n",
"<br><br>\n",
"$$a_{11}x_1^2 + a_{12}x_1x_2 + ... + a_{1n}x_1x_n$$<br> \n",
"$$+ a_{21}x_2x_1 + a_{31}x_3x_1 + ... + a_{n1}x_nx_1$$\n",
"<br><br> \n",
"これを微分すると以下となる。\n",
"<br><br>\n",
"$$2a_{11}x_1 + a_{12}x_2 + ... + a_{1n}x_n + a_{21}x_2 + a_{31}x_3 + ... + a_{n1}x_n$$<br>\n",
"$$= \\{a_{11}x_1 + a_{12}x_2 + ... + a_{1n}x_n\\} + \\{a_{11}x_1 + a_{21}x_2 + ... + a_{n1}x_n\\}$$\n",
"<br>\n",
"$$= \\sum_{j=1}^n a_{1j}x_j + \\sum_{k=1}^n a_{k1}x_k$$\n",
"<br><br>\n",
"他の変数についても同様であるため、一般化して以下のように書ける。\n",
"<br><br>\n",
"$$\\frac{\\partial f}{\\partial x_i} = \\sum_{j=1}^n a_{ij}x_j + \\sum_{k=1}^n a_{ki}x_k$$\n",
"<br><br>\n",
"ここで、一次形式の時同様ベクトル$$\\nabla f$$を以下のように定義すると、\n",
"<br><br>\n",
"$$\\nabla f = (\\frac{\\partial f}{\\partial x_1},...,\\frac{\\partial f}{\\partial x_n})^T$$\n",
"<br><br>\n",
"これは以下のように書き換えられる。\n",
"<br><br>\n",
"$$\\nabla f = (\\sum_{j=1}^n a_{1j}x_j + \\sum_{k=1}^n a_{k1}x_k, ..., \n",
" \\sum_{j=1}^n a_{nj}x_j + \\sum_{k=1}^n a_{kn}x_k)^T$$\n",
"<br><br>\n",
"これは先に定義した$${\\bf A}, {\\bf x}$$を用いて表すと以下である。\n",
"<br><br>\n",
"$$\\nabla f = ({\\bf A}+{\\bf A}^T){\\bf x}$$"
]
},
{
"cell_type": "code",
"execution_count": 111,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"ここで、$${\\bf A}$$が対称行列($$a_{ji}=a_{ij}$$)である場合、$$A^T=A$$であるので、以下となる。\n",
"<br><br>\n",
"$$\\nabla f = 2{\\bf A}{\\bf x}$$\n",
"<br><br>\n",
"ちなみに、与えられた係数行列$$A$$が対称行列でない場合でも、二次形式において常にこの$$A$$\n",
"を変形して対称行列である係数行列$$A'$$を得ることが可能である。詳細は「これなら分かる最適化数学」のp18を参照。\n",
"<br><br>\n",
"また、$$f$$がスカラーを返す二次形式の関数で与えられている場合、必ず対称行列である係数行列を以下のように算出できる。\n",
"<br><br>\n",
"$$f = ax^2 + 2bxy + cy^2$$<br>\n",
"である時、ベクトルと対称行列とで以下のように書ける。<br>\n",
"$$f = (\n",
" \\left(\n",
" \\begin{array}{cc}\n",
" x\\\\\n",
" y\\\\\n",
" \\end{array}\n",
" \\right),\n",
" \\left(\n",
" \\begin{array}{cc}\n",
" a & b \\\\\n",
" b & c \\\\\n",
" \\end{array}\n",
" \\right)\n",
" \\left(\n",
" \\begin{array}{cc}\n",
" x\\\\\n",
" y\\\\\n",
" \\end{array}\n",
" \\right)\n",
")$$\n",
"<br><br>\n",
"$$f = Ax^2+By^2+Cz^2 + 2(Dyz+Ezx+Fxy)$$<br>\n",
"である時、ベクトルと対称行列とで以下のように書ける。<br>\n",
"$$f = (\n",
" \\left(\n",
" \\begin{array}{c}\n",
" x\\\\\n",
" y\\\\\n",
" z\\\\\n",
" \\end{array}\n",
" \\right),\n",
" \\left(\n",
" \\begin{array}{ccc}\n",
" A & F & E \\\\\n",
" F & B & D\\\\\n",
" E & D & C\\\\\n",
" \\end{array}\n",
" \\right)\n",
" \\left(\n",
" \\begin{array}{c}\n",
" x\\\\\n",
" y\\\\\n",
" z\\\\\n",
" \\end{array}\n",
" \\right)\n",
")$$\n",
"\n",
"<br><br>\n",
"ちなみに次に説明する双一次形式においては、必ずしも係数行列が対称行列になるとは限らない。"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"ここで、$${\\bf A}$$が対称行列($$a_{ji}=a_{ij}$$)である場合、$$A^T=A$$であるので、以下となる。\n",
"<br><br>\n",
"$$\\nabla f = 2{\\bf A}{\\bf x}$$\n",
"<br><br>\n",
"ちなみに、与えられた係数行列$$A$$が対称行列でない場合でも、二次形式において常にこの$$A$$\n",
"を変形して対称行列である係数行列$$A'$$を得ることが可能である。詳細は「これなら分かる最適化数学」のp18を参照。\n",
"<br><br>\n",
"また、$$f$$がスカラーを返す二次形式の関数で与えられている場合、必ず対称行列である係数行列を以下のように算出できる。\n",
"<br><br>\n",
"$$f = ax^2 + 2bxy + cy^2$$<br>\n",
"である時、ベクトルと対称行列とで以下のように書ける。<br>\n",
"$$f = (\n",
" \\left(\n",
" \\begin{array}{cc}\n",
" x\\\\\n",
" y\\\\\n",
" \\end{array}\n",
" \\right),\n",
" \\left(\n",
" \\begin{array}{cc}\n",
" a & b \\\\\n",
" b & c \\\\\n",
" \\end{array}\n",
" \\right)\n",
" \\left(\n",
" \\begin{array}{cc}\n",
" x\\\\\n",
" y\\\\\n",
" \\end{array}\n",
" \\right)\n",
")$$\n",
"<br><br>\n",
"$$f = Ax^2+By^2+Cz^2 + 2(Dyz+Ezx+Fxy)$$<br>\n",
"である時、ベクトルと対称行列とで以下のように書ける。<br>\n",
"$$f = (\n",
" \\left(\n",
" \\begin{array}{c}\n",
" x\\\\\n",
" y\\\\\n",
" z\\\\\n",
" \\end{array}\n",
" \\right),\n",
" \\left(\n",
" \\begin{array}{ccc}\n",
" A & F & E \\\\\n",
" F & B & D\\\\\n",
" E & D & C\\\\\n",
" \\end{array}\n",
" \\right)\n",
" \\left(\n",
" \\begin{array}{c}\n",
" x\\\\\n",
" y\\\\\n",
" z\\\\\n",
" \\end{array}\n",
" \\right)\n",
")$$\n",
"\n",
"<br><br>\n",
"ちなみに次に説明する双一次形式においては、必ずしも係数行列が対称行列になるとは限らない。"
]
},
{
"cell_type": "code",
"execution_count": 103,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/latex": [
"<b>双一次形式</b><br>\n",
"$$x_1,x_2,...,x_n$$についても$$y_1,y_2,...,y_n$$についても一次の項のみからなる式をそれらの双一次形式\n",
"と呼び、以下のように表す。\n",
"<br><br>\n",
"$$f = a_{11}x_1y_1 + a_{12}x_1y_2 + ... + a_{1n}x_1y_n$$<br>\n",
"$$+ ...$$\n",
"$$+ a_{n1}x_ny_1 + a_{n2}x_ny_2 + ... + a_{nn}x_ny_n$$<br>\n",
"$$= \\sum_{i=1}^n\\sum_{j=1}^n a_{ij}x_iy_j$$\n",
"<br><br>\n",
"上で定義した$${\\bf A}{\\bf x}$$に加え、$${\\bf y} = (y_1,...,y_n)^T$$と定義すると、上の式は以下のように書ける。\n",
"<br><br>\n",
"$$f = ({\\bf x},{\\bf A}{\\bf y}) = {\\bf x}^T{\\bf A}{\\bf y}$$\n",
"<br><br>\n",
"この時、次の関係が成り立つ。すなわち任意のベクトル$${\\bf x},{\\bf y}$$と任意の行列$${\\bf A}$$\n",
"に対して次の公式を得る。\n",
"<br><br>\n",
"$$({\\bf A}{\\bf x},{\\bf y}) = ({\\bf x},{\\bf A}^T{\\bf y})$$"
],
"text/plain": [
"<IPython.core.display.Latex object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%latex\n",
"<b>双一次形式</b><br>\n",
"$$x_1,x_2,...,x_n$$についても$$y_1,y_2,...,y_n$$についても一次の項のみからなる式をそれらの双一次形式\n",
"と呼び、以下のように表す。\n",
"<br><br>\n",
"$$f = a_{11}x_1y_1 + a_{12}x_1y_2 + ... + a_{1n}x_1y_n$$<br>\n",
"$$+ ...$$\n",
"$$+ a_{n1}x_ny_1 + a_{n2}x_ny_2 + ... + a_{nn}x_ny_n$$<br>\n",
"$$= \\sum_{i=1}^n\\sum_{j=1}^n a_{ij}x_iy_j$$\n",
"<br><br>\n",
"上で定義した$${\\bf A}{\\bf x}$$に加え、$${\\bf y} = (y_1,...,y_n)^T$$と定義すると、上の式は以下のように書ける。\n",
"<br><br>\n",
"$$f = ({\\bf x},{\\bf A}{\\bf y}) = {\\bf x}^T{\\bf A}{\\bf y}$$\n",
"<br><br>\n",
"この時、次の関係が成り立つ。すなわち任意のベクトル$${\\bf x},{\\bf y}$$と任意の行列$${\\bf A}$$\n",
"に対して次の公式を得る。\n",
"<br><br>\n",
"$$({\\bf A}{\\bf x},{\\bf y}) = ({\\bf x},{\\bf A}^T{\\bf y})$$"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment