- Algorithm
- Incremental Method
- Simulation
- Backtracking
- Dynamic Programming
- Largest Empty Interval
- Location Allocation Problem
- Knapsack Problem
- Algorithm Analysis
- Data
- Sort
- Set
- 排序资料结构: Search Tree 系列
- Sequence 资料结构: Array / List
- 大量 Point 资料结构: k-Dimensional Tree
- Region 资料结构: Uniform Grid
- Graph
- Tree 资料结构: Heavy-Light Decomposition
- Graph Spectrum(Under Construction!)
- Tree
- Binary Tree
- Directed Acyclic Graph
- Articulation Vertex / Bridge
- Reachability
- Bipartite Graph
- Clique(Under Construction!)
- Planar Graph
- Path
- Single Source Shortest Paths: Label Correcting Algorithm
- Shortest Walk
- Cycle
- Spanning Tree
- s-t Flow
- Feasible s-t Flow
- Cut
- Matching
- T-Join
- Hamilton Circuit
- Domination
- Coloring
- Labeling
- Vector Product
- Sweep Line
- Rectangle
- Rectangle
- Polygon
- Convex Hull
- 3D Convex Hull(Under Construction!)
- Half-plane Intersection
- Voronoi Diagram
- Triangulation
- Metric
- Number
- Sequence
- Function (ℝ)
- Matrix
- Root Finding
- Linear Equations
- Functional Equation
- Optimization
- Interpolation
- Curve
- Regression
- Estimation
- Clustering
- Transformation(Under Construction!)
- Wave (ℝ)
- Representation
- Signal
- State(Under Construction!)
- Markov Chain
- System(Under Construction!)
- Markov Model
- Function
- Gray Code
- Base
- Divisor
- Prime
- Residue
- Lattice
- Series(Under Construction!)
- Average Number
- Nim
- String
- Longest Increasing Subsequence
- Longest Common Subsequence
- Approximate String Matching
- String Matching
- String Matching
- String Matching: Inverted Index
- Count Substrings
- Palindrome
- Language
- Code
- Compression
- Correction
- Encryption
- Transmission
- Data
- Text
- 2D Graphics
- Audio
- Audition(Under Construction!)
- Image
- Vision(Under Construction!)
- Model
- Motion(Under Construction!)
- Camera(Under Construction!)
- Glass(Under Construction!)
- Computer
- Physics
- Biology
- Medicine
- Finance
- Education
- Standard Library
Clustering
同声相应,同气相求;水流湿,火就燥,云从龙,风从虎。《易传》
Cluster
所有数据进行分组,相似数据归类于同一组,一笔数据只属于某一组,每一组称作一个“群集”。
如何定义所谓的相似呢?方法很多:距离越近,推定为越相似;邻居越密集,推定为越相似。
群集演算法的基本原理,一类是近朱者赤、近墨者黑,不断将数据重新分组;另一类是不断切割群集,表示成树状图。
演算法(K-Means Clustering)(Lloyd-Max Algorithm)
http://etrex.blogspot.tw/2008/05/k-mean-clustering.html
一、群集数量推定为 K,随机散佈 K 个点作为群集中心(常用既有的点)。
二、每一点分类到距离最近的群集中心(常用直线距离)。
三、重新计算每一个群集中心(常用平均值)。
重複二与三,直到群集不变、群集中心不动为止。最后形成群集中心的 Voronoi Diagram。
时间複杂度为 O(NKT),N 是数据数量,K 是群集数量,T 是重複次数。我们无法预先得知群集数量、重複次数。数据分布情况、群集中心的初始位置,都会影响重複次数,运气成份很大。
缺点是群集不能重叠、群集分界不能是曲线和折线、极端数据容易使群集中心偏移、一开始难以决定群集数量与群集中心、数据分布呈甜甜圈时群集中心可能永不停住。
演算法(K-Means++ Clustering)
https://mycourses.aalto.fi/mod/resource/view.php?id=153957
改良 K-Means Clustering 步骤一。逐一设定 K 个群集中心。计算每一个点到已设定的群集中心的最短距离,以最短距离的 n 次方做为机率大小,决定下一个群集中心。距离越远,机率越大。
0 次方等同随机散佈,K-Means。2 次方是 K-Means++。∞次方等同找最远点,Farthest-point Traversal,效果最好。
优点是群集中心比较分散,不容易挤在一起。
演算法(Linde-Buzo-Gray Clustering)
首先随机设定一个群集中心(常用平均值)。不断让群集中心往反方向分裂成两倍数量(常用少量移动、群集内最远点对),并且重新实施 K-Means Clustering。
优点是不用烦恼群集中心的初始位置。
演算法(EM Clustering)(Gaussian Mixture Model)
假设每个群集各是一个常态分布,平均数、变异数可以相异。
首先设定群集数量(常态分布数量)。然后将所有常态分布融合成一个分布,实施估计,估计方式採用 Maximum Likelihood,演算法採用 EM Algorithm。名称是这样来的。
融合数个常态分布成为一个分布,即 Gaussian Mixture Model,替每个常态分布设定不同比重。
优点是考虑了群集尺寸与疏密。
演算法(K-Nearest Neighbor Clustering)
每一点各自找到距离最近的 K 个点作为邻居,採多数决归类到群集。如果距离超过了自订临界值,找不足 K 个邻居,就替该点创造一个新的群集。
优点是不用烦恼群集数量,缺点是群集鬆散。
演算法(Jarvis-Patrick Clustering)
每一点各自找到距离最近的 K 个点做为邻居。当 a 和 b 彼此都是邻居,或者 a 和 b 至少有 K'个相同邻居(K'是自订临界值,K' ≤ K),则 a 和 b 归类到同一个群集。
优点是不用烦恼群集数量、群集形状。
演算法(DBSCAN)
https://en.wikipedia.org/wiki/DBSCAN
演算法(Nearest Neighbor Chain)
https://en.wikipedia.org/wiki/Nearest-neighbor_chain_algorithm
演算法(Minimum Spanning Tree)
运用“ Minimum Spanning Tree ”的瓶颈性质。实施 Kruskal's Algorithm,每次新添的边,若距离不超过 threshold,则边的两端就视作同一个群集。
演算法(Minimum Cut Tree)
运用“ Minimum Cut Tree ”的瓶颈性质。然而最小割是距离最近而不是距离最远,无法用于分离群集,所以就把一个割的权重修改为:
∑ w(i, j) ÷ min(|S|, |S|) i∈S j∈S
详情请读者请自行上网搜寻资料。
Classification
师旷之聪,不以六律,不能正五音。《孟子》
Classification
Clustering:未知群集(分类),找到群集(分类)。某些演算法会顺便找到分界线,例如 K-Means Clustering。
Classification:已知群集(分类),找到分界线。
群聚与隔离,一体两面。相似数据群聚,相异数据也渐渐隔离。最后出现了群聚中心,也出现了隔离界线。
不同类别的数据稍微黏在一起,仍然可以找到大致的分界线。如果不同类别的数据几乎混在一起(例如太极图案),那麽分界线没有任何意义。
找到分界线之后,对于一笔新的数据,就利用分界线来决定其类别──这就是 Classification 的主要功能。
如何应用 Classification?
Classification 应用十分广泛,是世上最实用的演算法之一,也是当前的研究热点之一。
比如说,让电脑拣土豆。一粒土豆是一笔数据,(土豆重量,土豆颜色) 是其数值。
首先,取一百粒土豆,个别以仪器测量其数值,然后人工进行分类,分为良与劣两类。这些数据全数输入到电脑当中。
接著,利用任何一种 Classification 的演算法,找到良与劣的分界线。
最后,每一粒新产的土豆,以仪器自动测量其数值,再用演算法判断数值在分界线的哪一侧,就能判断出土豆的良劣了。
应用 Classification 需要考量的关键点
这整套自动辨识的流程当中,我们需要考量的有:
一、我们要挑选哪些特徵?例如重量、颜色、形状等等。
二、我们要如何将特徵化为数值?例如用磅秤得到重量数值,用摄影机得到颜色数值,用影像处理演算法得到形状数值。
三、我们要取哪些土豆当作样本?这跟统计学有关。
四、我们如何提升分类的正确率?这跟统计学有关。
五、我们如何从分界线当中发现新的性质?例如重量越重则土豆越优、形状越圆则土豆越优之类的。
Error
Regression 让所有间距平方和尽量小。Clustering 让最大间距尽量小。Classification 让最小间距尽量大。三者都是针对间距进行 Optimization。
Point-set Function【尚无专有名词】
Regression、Clustering、Classification 可以看做是“点集合函数”最佳化。函数输入是一个点集合,代表数据们;函数输出是一个数值,代表误差总和。
后面章节的演算法们,虽然挂名为 Classification 演算法,但是本质都是“点集合函数最佳化演算法”。更换一下误差函数,即可解决 Regression、Clustering、Classification,甚至其他问题。
注意到,凸函数最佳化,有著高速演算法,有著唯一的极值。我们往往把误差函数设计成凸函数。
点到点距离、点到直线距离,恰是凸函数。凸函数的平方,仍是凸函数。多个凸函数相加、取最大值,仍是凸函数。
Linear Classification
Linear Classification
以直线当作分界线。
数据的维度可以推广到三维以上,此时分界线就成了分界面、分界体等等。分界物是数据维度减少一维(hyperplane)。
虽然可以视作计算几何问题,但是当维度太高的时候,计算相当複杂,难以快速求得精确解。因此採用了数值方法的套路。
演算法(Perceptron)
不考虑分界线到数据的距离。分界线只要分开数据即可。
分界线是一条直线 ax+by+c=0。想判断一笔数据(x₁,y₁) 位于分界线的哪一侧,就将(x₁,y₁) 代入到直线方程式,计算 ax₁+by₁+c,如果大于零就是在正侧,小于零就是在反侧,等于零就是在分界线上。
每一笔数据都代入计算,不见得都能正确分类。我们必须调整分界线的位置,也就是调整 a b c 三个参数。该如何调整才好呢?我们可以利用最佳化的思维。
设定误差是“正确结果、分类结果不相符的数据笔数”,误差越小越好。为了方便统计误差,将结果定为数值 0 和 1。正确结果:数据共两类,第一类数据定为 0,第二类数据定为 1。分类结果:数据在线上、在反侧定为 0,数据在正侧定为 1。
如此一来,统计误差,只需数值运算、无需逻辑运算。正确结果和分类结果先相减再平方,等于 0 即相符,等于 1 即不相符。
0 和 1 颠倒设定也没关係,a b c 的计算结果多了负号而已。
N 2 ∑ [gᵢ - u(axᵢ+byᵢ+c)] i=1 gᵢ : correct result of data i (0 or 1) u(axᵢ+byᵢ+c): classified result of data i (0 or 1) u : unit step function (0 or 1)
最佳化演算法採用 Gradient Descent:往梯度最陡的方向逐步移动。首先推导梯度,也就是分别对 a b c 三个变数进行偏微分:
∂ N 2 ―― ∑ [gᵢ - u(axᵢ+byᵢ+c)] = ∑ [gᵢ - u(axᵢ+byᵢ+c)] ⋅ -2xᵢ ∂a i=1 = ∑ errorᵢ ⋅ -2xᵢ ∂ N 2 ―― ∑ [gᵢ - u(axᵢ+byᵢ+c)] = ∑ [gᵢ - u(axᵢ+byᵢ+c)] ⋅ -2yᵢ ∂b i=1 = ∑ errorᵢ ⋅ -2yᵢ ∂ N 2 ―― ∑ [gᵢ - u(axᵢ+byᵢ+c)] = ∑ [gᵢ - u(axᵢ+byᵢ+c)] ⋅ -2 ∂c i=1 = ∑ errorᵢ ⋅ -2
一开始 a b c 设定成任意值。a b c 不断往梯度最陡的方向移动一段距离,朝最小值前进:
[ 0 ] w0 = [ 0 ] 一开始 a b c 设定成任意值 [ 0 ] [ ∑ errorᵢ ⋅ -2xᵢ ] [ ∑ errorᵢ ⋅ xᵢ ] wt+1 = wt - rate [ ∑ errorᵢ ⋅ -2yᵢ ] = wt + 2 rate [ ∑ errorᵢ ⋅ yᵢ ] [ ∑ errorᵢ ⋅ -2 ] [ ∑ errorᵢ ] 通常会把 2 併入 rate。或者一开始设定误差函数多乘一个 1/2,来把 2 消掉。
推广成 online 演算法,依序处理每一笔数据,一次一笔。
[ errorᵢ ⋅ xᵢ ] wt+1 = wt + 2 rate [ errorᵢ ⋅ yᵢ ] [ errorᵢ ] 通常会把 2 併入 rate。或者一开始设定误差函数多乘一个 1/2,来把 2 消掉。
公式非常简洁!这就是为什麽使用这种误差设定方式、使用 Gradient Descent 的原因。这是前人努力试验出来的最简洁的方式。
当数据可分为两半,则误差呈单峰函数,Gradient Descent 不会卡在区域极值。证明方式是逐次加入一笔数据。【尚待确认】
换句话说,当数据可分为两半,而且 rate 适中(太小导致摊在山腰、太大导致越过山顶),则此演算法一定可以找到正确的分界线。当数据不可分为两半,则此演算法毫无用武之地。
“一笔数据代入直线方程式”这件事,通常画成理工味道十足的图。这个东西有个古怪名称叫做 perceptron:
所有输入乘上权重、相加起来,经过 unit step function,最后输出 0 或 1(也有人输出+1 或-1)。
函数不一定得是 unit step function。有些时候需要输出实数,就可以改成 sigmoid function。
UVa 11289 ICPC 3581
演算法(Support Vector Machine)
考虑分界线到数据的距离。分界线位于正中央,两类数据相隔越远越好。准确来说,分界线到两类数据的最短距离均等、最短距离越大越好。
举例来说,二维的情况下,两类数据各自求凸包,分界线是凸包之间最近点对的中垂线,或者分界线平行于凸包上某一条边。
但是当维度太高的时候,难以计算凸包、中垂超平面。只好採用数值方法的套路。
分界线是一条直线 ax+by+c=0。想计算一笔数据(x₁,y₁) 到分界线的距离,就将(x₁,y₁) 代入到点与直线距离公式,计算(ax₁+by₁+c) / sqrt(a²+b²)。距离有正负号,如果大于零就是在正侧,小于零就是在反侧,等于零就是在分界线上。
间距线是两条直线 ax+by+c=1 和 ax+by+c=-1(已将截距缩放为 1)。想计算间距线到分界线的距离,就将间距线上任意一点代入到点与直线距离公式(显然分子是 1 和-1)。如此便得到半个间距。
每一笔数据到分界线的距离,都必须大于等于半个间距。而且每一笔数据都要选对边。
当数据可以分成两半,採用 regularization:最大化间距,限制是全部数据都分对。
为了方便判断距离,数据标记为-1 和+1(本应是 0 和 1)。为了避免除以零,改为最小化间距的倒数(本应是负数)。为了方便最佳化,再取平方变成凸函数。
s classifer: px+qy+r=0 margin: px+qy+r=±s half-width: ――――――――――― sqrt(p²+q²) let a = p/s, b = q/s, c = r/s, remove variable s. 1 classifer: ax+by+c=0 margin: ax+by+c=±1 half-width: ――――――――――― sqrt(a²+b²) 1 axᵢ+byᵢ+c 1 max ――――――――――― subject to { ――――――――――― ≥ ――――――――――― ⋅ gᵢ } for all i sqrt(a²+b²) sqrt(a²+b²) sqrt(a²+b²) 1 max ――――――――――― subject to { axᵢ+byᵢ+c ≥ gᵢ } for all i sqrt(a²+b²) min sqrt(a²+b²) subject to { axᵢ+byᵢ+c ≥ gᵢ } for all i min (a²+b²) subject to { axᵢ+byᵢ+c ≥ gᵢ } for all i min (a²+b²) + ∑ αᵢ [ (axᵢ+byᵢ+c) - gᵢ ] (αᵢ ≥ 0)
当数据不能分成两半,採用 scalarization:最大化间距,最小化分错的数据数量。记得调整成凸函数。不过没人这样做。
1 max ――――――――――― , min ∑ [ axᵢ+byᵢ+c < gᵢ ] sqrt(a²+b²) min α (a²+b²) + β ∑ [u(gᵢ - (axᵢ+byᵢ+c))]² (α ≥ 0, β ≥ 0)
有人删去 unit step 函数,把β设定成 1,称做 Least Squares Support Vector Machine。有点莫名其妙。
min α (a²+b²) + β ∑ [gᵢ - (axᵢ+byᵢ+c)]² (α ≥ 0, β = 1)
Inlier / Outlier
真实世界的数据并非完美,常有例外。
无弹性的定义:全部数据分为 inlier 和 outlier;inlier 是分对的数据,outlier 是分错的数据。
有弹性的定义:全部数据分为 inlier 和 outlier;inlier 是距离分界线太近的数据、以及分对的数据,outlier 是距离分界线太远又分错的数据。
顺带一提,当数据无法分两半,常见的手法是:无视弹性范围内的数据,并且限制其数量上限。可以透过 regularization 处理。
演算法(AdaBoost)(Adaptive Boosting)
实施分类演算法,分错的数据,複制并增加其数量,再继续实施分类演算法。这使得误差大幅增加,使得分界线大幅靠近分错的数据,进而迅速减少分错的数据。
增加倍率:分对的数量除以分错的数量。数量不必是整数。
AdaBoost 好处多多。分类过程中,分界线的移动步伐变大了,提早找到正确分界线。分类结束后,每笔数据的数量,可以看成是出错程度,可依此判断 outlier。分类结束后,如果数据无法正确分两半,就以每回合的分界线的平均,推定是最理想的分界线。
AdaBoost 儘管缺乏理论根据,儘管名字怪异,却非常实用。
演算法(Gradient Boosting)
实施分类演算法,得到分界线。然后不断微调分界线。
挑出分错的数据,另外实施分类演算法,得到微调用的分界线。当前分界线,加上微调用的分界线,完成一次微调。重複这些步骤,直到分错的数据足够少,或者是误差总和足够小。
微调用的分界线,可以乘上倍率。注意到倍率太大就不是微调了,而倍率太小就失去调整效果了。
概念宛如 Gradient Descent,故取名 Gradient。概念宛如 Adaptive Boosting,故取名 Boosting。
Polynomial Classification
Polynomial Classification
以多项式曲线、多项式曲面当作分界线。
根据工程师的实验,数据套用函数重新呈现、分界线是直线,原始数据、分界线是曲线,前者比后者的效果更好──儘管目前还没有严谨的数学证明。因此这裡就不介绍分界线是曲线的情况了。
Representation(Feature Map)
classifier center = (24,22) radius = 10, #(data) = 13 + 7 = 21 p = {{17,8},{21,8},{27,8},{33,10},{37,15},{39,22},{36,30},{30,35},{21,35},{12,32},{12,28},{7,22},{10,14},{18,15},{24,16},{28,18},{16,19},{18,24},{24,23},{31,25},{27,29}}; f[x_] := (x-24)*(x-24); g[y_] := (y-22)*(y-22); h[x_,y_] := Sqrt[2]*(x-24)*(y-22); q = Transpose[{ f[ p[[All,1]] ], g[ p[[All,2]] ], Apply[h, p, {1}] }]; ListPointPlot3D[{q[[1;;13]], q[[14;;21]]}, BoxRatios -> {1,1,1}, PlotStyle -> PointSize[Large]] c = Classify[q -> {"A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B"}, "Decision", Method->"SupportVectorMachine"];
http://cseweb.ucsd.edu/classes/sp13/cse151-a/Kernels.pdf
数据套用函数、增加维度,重新呈现。新数据的分界线是直线,则原数据的分界线是曲线。
但是如何挑选函数呢?首先你要学会通灵。
点与直线距离,时间複杂度从 O(D) 变成 O(D'),D 是原数据的维度,D'是新数据的维度。
Kernel
http://www.robots.ox.ac.uk/~az/lectures/ml/
http://cseweb.ucsd.edu/~dasgupta/250B/kernel-slides.pdf
分界线的参数 a b c,其中 a b 可以表示成数据的加权平均值(数据根据其类别额外乘上+1 或-1)。点与直线距离,其中一部分变成了数据与数据的点积,称作 kernel。
想要让数据套用函数,有个技巧称做 kernel trick:不直接设计函数,而是间接设计 kernel。将 kernel 改写成“两个相同式子的点积”的格式,就能知道函数。
点与直线距离,运用 kernel,只需原数据、无需新数据,时间複杂度为 O(ND),D 是原数据的维度。当原维度远小于新维度,kernel trick 就有好处,可以很快算好误差总和。
Underfitting / Overfitting
用单纯的函数去区分複杂的数据们,显然分类的不太完美。
用複杂的函数去区分单纯的数据们,显然事情被搞複杂了。
如果我们不清楚数据的性质,也就无法抉择函数了。那麽,该如何了解数据的性质呢?这属于宗教信仰的范畴,就此打住。
Hierarchical Classification
Hierarchical Classification
数据往往无法顺利地一分为二,数据往往有两种以上类别,先前的演算法往往毫无用武之地。
解法是阶层架构、树状图,称作“决策树 Decision Tree”。
另一种解法是一连串测试,称作“蕨 Fern”。奇葩的名称。蕨是决策树的简易版本:同一层节点,共用同一条分界线。
演算法(Decision Tree)(Classification Tree)
援引“ k-Dimensional Tree ”的精神,用于分类。
贪心法。选择分类效果最好的分界线,将数据分两份。两份数据分头递迴下去,直到不同类别的数据都被分开为止。
每次选择分界线时,穷举各种分界线走向(穷举每个维度),穷举各种分界线位置(穷举每笔数据),从中找到分类效果最好者。
分界线两侧的数据,分头计算混乱程度。两个混乱程度,求加权平均值(权重是数据数量),做为分类效果。数值越低,效果越好。
混乱程度有两种评估方式:一、Gini impurity:各个类别的数据比例,两两相乘(不乘自身),总和越小越好;二、information gain:各个类别的数据比例,求熵,总和越小越好。
两种方式都没有科学根据。通常使用第一种,比较好算。
不採用清澈程度、却採用混乱程度,这般迂迴曲折,是因为清澈程度不好揣摩、而混乱程度容易具体实现。
Gini impurity: ∑ [ p(Ci) p(Cj) ] = 1 - ∑ [ p(Ci) p(Ci) ] i≠j i information gain: - ∑ [ p(Ci) log₂ p(Ci) ] i Ci :第 i 种类别的数据集合。 p(Ci):第 i 种类别的数据数量,除以所有类别的数据总数量。也就是比例。
因为是贪心法,所以分界线配置往往不是最精简的、分界线数量往往不是最少的。
时间複杂度为 O(DNNN)。运用“ 扫描线 ”为 O(DNNlogN)。当运气很好,数据的数量每次都刚好对半分,为 O(DN(logN)^2)。
一、穷举 D 个维度、穷举 N 笔数据,找到分界线。 二、针对一条分界线,判断每笔数据位于哪一侧,需时 O(N)。 三、两侧数据,分头计算 C 种类别之间的混乱程度,需时 O(C)。C 通常视作常数。 四、分界线数量最少 0 条(数据只有唯一一种类别)。 分界线数量最多 N-1 条(每次都分出一笔数据)。 分界线数量就是节点数量。
Graphical Classification(Under Construction!)
楔子
Neuron 与 Perceptron
生物学家、医学家研究动物,发现了动物藉由神经来接收与传达讯息,神经的基本单位是“神经元”。后来又发现,动物的大脑由大量神经元构成。
计算学家、数学家仿照神经元,发明了“感知器”,用来分类和预测事物。后来又发现,感知器其实就是线性分类器。
于是科学家大胆猜测:大脑似乎是一大堆线性分类器,思考似乎是一连串线性分类!科学家正在深入研究当中。
人格、行为、情绪、本能、直觉、天分、三观、智力、智慧,这些抽象的心理概念,也许就是一堆线性分类器。
一大堆 Neuron 与 Perceptron
神经元、感知器能做什麽事?
数学家发现感知器可以分类。一个感知器,制造笔直的分界线。一连串感知器,得以兜出各式各样的分类效果,制造曲折的分界线。
这个发现相当重要。适当地排列组合感知器,就拥有辨识能力。大脑的辨识能力很可能源自于此!
数学家发现感知器可以算数学。一层可兜出逻辑运算 NOT 和 AND 和 OR,两层可兜出逻辑运算 XOR 和 XNOR。进一步从逻辑运算兜出数值运算。进一步从数值运算兜出演算法。
这个发现相当重要。适当地排列组合感知器,就拥有判断能力、计算能力。大脑的判断能力、计算能力很可能源自于此!
大脑拥有大量神经元,应该得以进行非常深奥的推理,甚至超越逻辑所能描述的现象。例如由爱生恨、爱之深责之切、爱到深处无怨尤,大脑经常产出超乎理性的结论。
然而科学家迄今还不知道大脑的详细结构。比如说“由爱生恨”的神经元如何连结呢?没有人知道!科学家正在克服这个问题。
http://zhuanlan.zhihu.com/p/20561464
Artificial Neural Network
“人工神经网路”、“类神经网路”。大量感知器串联成网路,建立阶层架构,模仿大脑!
然而我们往往不知道人工神经网路该兜成什麽样子。于是大家捨难取易──选择特定款式,藉由调整权重,达到分类效果。人工神经网路的经典款式如:
Feedforward Neural Network Recurrent Neural Network Spiking Neural Network Convolutional Neural Network Restricted Boltzmann Machine
真实神经网路,神经元会增生、死亡、重新连结。人工神经网路,格式固定,感知器不会增生、死亡、重新连结,分类效果较差。
为什麽不改成动态版本呢?因为时间複杂度。动态版本的计算量更加巨大,而现今计算机的计算力仍嫌不足。
近况
人工神经网路的潜力,远远超越目前的演算法,远远超越我们以穷举法、分治法、动态规划、贪心法所设计出来的演算法。最近电脑打败人类围棋冠军,正是使用人工神经网路,棋风宛如真人。
http://www.zhihu.com/question/39905662/answer/88895000
学术单位正在研究人工神经网路的功效,公司行号正在制作人工神经网路的晶片。又由于分散式计算的崛起,计算机的计算力增加了,使得人工神经网路的研究略有进展。人工神经网路正夯。
http://www.zhihu.com/question/24825159/answer/29427405
各个领域的专家,也开始关注神经系统。关键字如 neuroscience、neural computing、neural engineering,请读者自行研究。
远景
人工神经网路应该可以效仿编译器自举。我们总是用人脑设计演算法,既然人脑是神经元构成的网路、演算法是感知器构成的网路,理所当然我们能用人工神经网路设计人工神经网路。
学以致用、神来之笔,这些抽象的心理概念,也许就是自举。
逻辑运算 → 数值运算 → 分类运算 → 算法
古人发明了逻辑运算(藉由电路),再用逻辑运算兜出数值运算(藉由二进位),再用数值运算兜出演算法(藉由流程图)。至此是地球人的最新进度。
目前计算学家正在尝试:用数值运算兜出分类运算(藉由数值方法),再用分类运算兜出演算法(藉由神经元)。让我们拭目以待!
演算法(Feedforward Neural Network)
http://playground.tensorflow.org/
一层一层铺起,容易计算。
http://www4.rgu.ac.uk/files/chapter3%20-%20bp.pdf http://colah.github.io/posts/2015-08-Backprop/ 一、凭感觉设定层数、设定每一层的 perceptron 数量。 没人知道正确数量应该是多少。 二、输入一笔数据之后,更新每一个 perceptron 的所有入边的权重: 由于必须拿到 output error 才能更新,所以要从 output 层往回更新。 (backpropagation 名称由此而来。) 三、计算一个 perceptron 的 output error: 针对一个出边,“出边的权重”乘上“出边的 perception 的 output error”, 然后所有出边算得的,通通加起来。
不断输入资料、输出结果,逐步调整每个 perceptron 的分界线,最后得到一个分类器。
http://colah.github.io/posts/2014-03-NN-Manifolds-Topology/ 1. 把每一层的功能想做是 representation 2. sigmoid/tanh 的用途是让 representation 有著形变效果 3. 引入流形的相关知识,尝试判断是否可以找到分界线
一种多层次的 sparse coding 的机制
范例:分辨上下
000011 111100 000011 010111 101111 110110 111101 001111 000000 000110 011110 000110 001110 011001 101001 110110 100111 011001 011100 001100 110000 000001 111000 001111 111111 011100 111111 000000 000110 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 111000 011100 110000 011111 011110 011110 011110 011110 111110 111110 001111 110111 111110 110001 111111 110011 010110 110011 101011 100111 000001 000001 000011 110000 011111 000001 011110 111110 111001 111110
http://www.webpages.ttu.edu/dleverin/neural_network/neural_networks.html 输入值、初始值、层数会影响收敛结果 输入值太小、学习率太大 两边会分不开 初始值一开始接近零 就会爆炸 原因不清楚 第一层的 perceptron 有 row 个,每个 perceptron 的输入变数有 col 个,输入值是各个 pixel。 第二层只有一个 perceptron,输入变数 col 个,来自上一层
Bayesian Classification(Under Construction!)
Bayesian Classification
迄今都是假定一笔数据只有唯一一种类别。
现在推广成一笔数据有多种类别,类别是浮动数字,每种类别的机率高低都不同。
对调主角与配角,切换视角,一种类别也就有多笔数据,数据是浮动数字,每种数据的机率高低都不同。
贝式定理可以用来切换视角。
Linear Discriminative Analysis
援引“ Principal Component Analysis ”的精神,用于分类。
寻找一组新座标轴,让数据投影到座标轴之后,各类数据的平均值的变异数尽量大(异类尽量散开),各类数据各自的变异数尽量小(同类尽量聚集)。
个人推测 kernel trick (representer theorem)、spectral transform、Ax² optimization 有著某种关联。数据有了类别。
Neighborhood Component Analysis
援引“ Principal Component Analysis ”的精神,用于分类。
找到一个转换矩阵,让新数据同类相聚。统计同类数据之间的两两距离总和,令距离越近越好。距离定义成有向距离:相离最近的 K 个邻居所构成的 softmax 函数的平方。因为难以预测新数据的邻居关係,所以姑且採用原数据的邻居关係。
https://en.wikipedia.org/wiki/Neighbourhood_components_analysis
Online Classification
Online Classification
屡屡新增数据,时时修正迴归结果、分类结果。
http://courses.cs.washington.edu/courses/cse599s/14sp/scribes.html
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论