感知机原理
以下3篇文章写的很好,不敢赘述。
统计学习方法|感知机原理剖析及实现对感知机的讲解很直观。例如有一堆零件,每个零件有重量、长度等。零件检验人员依据专业知识,按零件的重量(重量在10-20且长度在1-5为好)和长度判断零件质量的好坏而将一堆零件分为good和bad两类——即样本。对于非专业人员(如程序员)、电脑,给一个零件,如何判断质量好坏?没有专业背景知识,只能猜测判断好坏的依据——即特征:零件的颜色、重量、长度、体积等等,然后建立4维特征空间的向量样本,进行训练。最关键的其实是特征提取!梯度下降法求解感知机模型,该文中的梯度下降法求解函数最小值的实例很好,有助于理解梯度下降法的应用。机器学习之感知机与梯度下降法认知,该文先求解梯度(偏导),以便于负梯度方向更新值,便于理解更新过程。下图也来源于该文。
C#代码实现
class Perceptron
{
public double[] PerceptronTrain(double[,] SampleData
,double step
, int MAXIterationNum
)
{
int flag
= 0;
int times
= 0;
int dimension
= SampleData
.GetLength(0)-1;
int rowsNum
= SampleData
.Length
/ (dimension
+ 1);
double[] para
= new double[dimension
+1];
for (int i
= 0; i
< para
.Length
; i
++)
{
para
[i
] = 0;
}
do
{
for (int i
= 0; i
< rowsNum
; i
++)
{
double y
=0;
for (int j
= 0; j
< dimension
; j
++)
{
y
+= para
[j
] * SampleData
[i
, j
];
}
y
+= para
[dimension
];
if (sign(y
)!=SampleData
[i
,dimension
])
{
for (int j
= 0; j
< dimension
; j
++)
{
para
[j
]= para
[j
] +step
* SampleData
[i
,j
]*SampleData
[i
,dimension
];
}
para
[dimension
]+=step
* SampleData
[i
, dimension
];
flag
=1;
times
+= 1;
break;
}
else
{
flag
= 0;
}
}
} while (flag
== 1&×
< MAXIterationNum
);
return para
;
}
public int sign(double y
)
{
if (y
< 0||y
==0)
{
return -1;
}
else
{
return 1;
}
}
运行结果如下图: