均等准则算法
㈠ 运动估计的准则分类
运动搜索的目的就是在搜索窗内寻找与当前块最匹配的数据块,这样就存在着如何判断两个块
是否匹配的问题,即如何定义一个匹配准则。而匹配准则的定义与运算复杂度和编码效率都是直接
相关的,通常有如下几类比较常用的匹配函数的定义:
设当前帧 f2,参考帧f1,
(1)最小均方差函数(MSE)
MSE (MV) =Σ|f2(x,MV)-f1(x)|
2
(3.34)
(2)最小平均绝对值误差(MAD)等效于常用的绝对差值和(SAD)准则,性能很好,而且相对简单
的硬件需求,因而得到了最广泛的应用。
MAD (MV) =Σ|f2(x,MV)-f1(x)| (3.35)
(3)阈值差别计数(NTD)
NTD(MV)=ΣG(f2(x,MV)-f1(x)) (3.36)
其中:
当 | α-β | >T0 时,G(α,β)=1;
当 | α-β | <T0 时,G(α,β)=0 (3.37)
由于在用块匹配算法进行运动估计的过程中,利用匹配准则函数进行匹配误差的计算是最主要
的计算量,因此,我们可以从这方面进一步减少计算量。由于图象的帧内也具有相关性,在计算误
差匹配函数时,可以只让图象块中的部分像素参与运算,将块中的所有像素组成一个集合,那么参
与计算的这部分像素集合就是它的子集,这种误差匹配的方法被称为子集匹配法。实验结果表明,
在匹配误差无明显增加的情况下,采用子集匹配可以大大减少每帧图象的平均搜索时间。
㈡ 自适应均衡可以采用哪些最佳准则
最小均方误差算法(LMS)、递归最小二乘法(RLS)、快速递归最小二乘算法(Fast RLS)、平方根递归最小二乘法(Square Root RLS)和梯度最小二乘法(Gradient RLS)。
㈢ 描述算法评价的准则
时间复杂度(主要),空间复杂度(次要)
㈣ 什么是最小均方(LMS)算法
全称 Least mean square 算法。中文是最小均方算法。
感知器和自适应线性元件在历史上几乎是同时提出的,并且两者在对权值的调整的算法非常相似。它们都是基于纠错学习规则的学习算法。感知器算法存在如下问题:不能推广到一般的前向网络中;函数不是线性可分时,得不出任何结果。而由美国斯坦福大学的Widrow和Hoff在研究自适应理论时提出的LMS算法,由于其容易实现而很快得到了广泛应用,成为自适应滤波的标准算法。
LMS算法步骤:
1,、设置变量和参量:
X(n)为输入向量,或称为训练样本
W(n)为权值向量
b(n)为偏差
d(n)为期望输出
y(n)为实际输出
η为学习速率
n为迭代次数
2、初始化,赋给w(0)各一个较小的随机非零值,令n=0
3、对于一组输入样本x(n)和对应的期望输出d,计算
e(n)=d(n)-X^T(n)W(n)
W(n+1)=W(n)+ηX(n)e(n)
4、判断是否满足条件,若满足算法结束,若否n增加1,转入第3步继续执行。
㈤ 大数据十大经典算法之k-means
大数据十大经典算法之k-means
k均值算法基本思想:
K均值算法是基于质心的技术。它以K为输入参数,把n个对象集合分为k个簇,使得簇内的相似度高,簇间的相似度低。
处理流程:
1、为每个聚类确定一个初始聚类中心,这样就有k个初始聚类中心;
2、将样本按照最小距离原则分配到最邻近聚类
3、使用每个聚类中的样本均值作为新的聚类中心
4、重复步骤2直到聚类中心不再变化
5、结束,得到K个聚类
划分聚类方法对数据集进行聚类时的要点:
1、选定某种距离作为数据样本间的相似性度量,通常选择欧氏距离。
2、选择平价聚类性能的准则函数
用误差平方和准则函数来评价聚类性能。
3、相似度的计算分局一个簇中对象的平均值来进行
K均值算法的优点:
如果变量很大,K均值比层次聚类的计算速度较快(如果K很小);
与层次聚类相比,K均值可以得到更紧密的簇,尤其是对于球状簇;
对于大数据集,是可伸缩和高效率的;
算法尝试找出使平方误差函数值最小的k个划分。当结果簇是密集的,而簇与簇之间区别明显的时候,效果较好。
K均值算法缺点:
最后结果受初始值的影响。解决办法是多次尝试取不同的初始值。
可能发生距离簇中心m最近的样本集为空的情况,因此m得不到更新。这是一个必须处理的问题,但我们忽略该问题。
不适合发现非凸面形状的簇,并对噪声和离群点数据较敏感,因为少量的这类数据能够对均值产生较大的影响。
K均值算法的改进:
样本预处理。计算样本对象量量之间的距离,筛掉与其他所有样本那的距离和最大的m个对象。
初始聚类中心的选择。选用簇中位置最靠近中心的对象,这样可以避免孤立点的影响。
K均值算法的变种:
K众数(k-modes)算法,针对分类属性的度量和更新质心的问题而改进。
EM(期望最大化)算法
k-prototype算法
这种算法不适合处理离散型属性,但是对于连续型具有较好的聚类效果。
k均值算法用途:
图像分割;
衡量足球队的水平;
下面给出代码:
#include <iostream>
#include <vector>
//auther archersc
//JLU
namespace CS_LIB
{
using namespace std;
class Kmean
{
public:
//输入格式
//数据数量N 维度D
//以下N行,每行D个数据
istream& loadData(istream& in);
//输出格式
//聚类的数量CN
//中心维度CD
//CN行,每行CD个数据
//数据数量DN
//数据维度DD
//以下DN组,每组的第一行两个数值DB, DDis
//第二行DD个数值
//DB表示改数据属于一类,DDis表示距离改类的中心的距离
ostream& saveData(ostream& out);
//设置中心的数量
void setCenterCount(const size_t count);
size_t getCenterCount() const;
//times最大迭代次数, maxE ,E(t)表示第t次迭代后的平方误差和,当|E(t+1) - E(t)| < maxE时终止
void clustering(size_t times, double maxE);
private:
double calDistance(vector<double>& v1, vector<double>& v2);
private:
vector< vector<double> > m_Data;
vector< vector<double> > m_Center;
vector<double> m_Distance;
vector<size_t> m_DataBelong;
vector<size_t> m_DataBelongCount;
};
}
#include "kmean.h"
#include <ctime>
#include <cmath>
#include <cstdlib>
//auther archersc
//JLU
namespace CS_LIB
{
template<class T>
void swap(T& a, T& b)
{
T c = a;
a = b;
b = c;
}
istream& Kmean::loadData(istream& in)
{
if (!in){
cout << "input error" << endl;
return in;
}
size_t dCount, dDim;
in >> dCount >> dDim;
m_Data.resize(dCount);
m_DataBelong.resize(dCount);
m_Distance.resize(dCount);
for (size_t i = 0; i < dCount; ++i){
m_Data[i].resize(dDim);
for (size_t j = 0; j < dDim; ++j){
in >> m_Data[i][j];
}
}
return in;
}
ostream& Kmean::saveData(ostream& out)
{
if (!out){
cout << "output error" << endl;
return out;
}
out << m_Center.size();
if (m_Center.size() > 0)
out << << m_Center[0].size();
else
out << << 0;
out << endl << endl;
for (size_t i = 0; i < m_Center.size(); ++i){
for (size_t j = 0; j < m_Center[i].size(); ++j){
out << m_Center[i][j] << ;
}
out << endl;
}
out << endl;
out << m_Data.size();
if (m_Data.size() > 0)
out << << m_Data[0].size();
else
out << << 0;
out << endl << endl;
for (size_t i = 0; i < m_Data.size(); ++i){
out << m_DataBelong[i] << << m_Distance[i] << endl;
for (size_t j = 0; j < m_Data[i].size(); ++j){
out << m_Data[i][j] << ;
}
out << endl << endl;
}
return out;
}
void Kmean::setCenterCount(const size_t count)
{
m_Center.resize(count);
m_DataBelongCount.resize(count);
}
size_t Kmean::getCenterCount() const
{
return m_Center.size();
}
void Kmean::clustering(size_t times, double maxE)
{
srand((unsigned int)time(NULL));
//随机从m_Data中选取m_Center.size()个不同的样本点作为初始中心。
size_t *pos = new size_t[m_Data.size()];
size_t i, j, t;
for (i = 0; i < m_Data.size(); ++i){
pos[i] = i;
}
for (i = 0; i < (m_Data.size() << 1); ++i){
size_t s1 = rand() % m_Data.size();
size_t s2 = rand() % m_Data.size();
swap(pos[s1], pos[s2]);
}
for (i = 0; i < m_Center.size(); ++i){
m_Center[i].resize(m_Data[pos[i]].size());
for (j = 0; j < m_Data[pos[i]].size(); ++j){
m_Center[i][j] = m_Data[pos[i]][j];
}
}
delete []pos;
double currE, lastE;
for (t = 0; t < times; ++t){
for (i = 0; i < m_Distance.size(); ++i)
m_Distance[i] = LONG_MAX;
for (i = 0; i < m_DataBelongCount.size(); ++i)
m_DataBelongCount[i] = 0;
currE = 0.0;
for (i = 0; i < m_Data.size(); ++i){
for (j = 0; j < m_Center.size(); ++j){
double dis = calDistance(m_Data[i], m_Center[j]);
if (dis < m_Distance[i]){
m_Distance[i] = dis;
m_DataBelong[i] = j;
}
}
currE += m_Distance[i];
m_DataBelongCount[m_DataBelong[i]]++;
}
cout << currE << endl;
if (t == 0 || fabs(currE - lastE) > maxE)
lastE = currE;
else
break;
for (i = 0; i < m_Center.size(); ++i){
for (j = 0; j < m_Center[i].size(); ++j)
m_Center[i][j] = 0.0;
}
for (i = 0; i < m_DataBelong.size(); ++i){
for (j = 0; j < m_Data[i].size(); ++j){
m_Center[m_DataBelong[i]][j] += m_Data[i][j] / m_DataBelongCount[m_DataBelong[i]];
}
}
}
}
double Kmean::calDistance(vector<double>& v1, vector<double>& v2)
{
double result = 0.0;
for (size_t i = 0; i < v1.size(); ++i){
result += (v1[i] - v2[i]) * (v1[i] - v2[i]);
}
return pow(result, 1.0 / v1.size());
//return sqrt(result);
}
}
#include <iostream>
#include <fstream>
#include "kmean.h"
using namespace std;
using namespace CS_LIB;
int main()
{
ifstream in("in.txt");
ofstream out("out.txt");
Kmean kmean;
kmean.loadData(in);
kmean.setCenterCount(4);
kmean.clustering(1000, 0.000001);
kmean.saveData(out);
return 0;
}
㈥ 智能算法的算法分类
模拟退火算法的依据是固体物质退火过程和组合优化问题之间的相似性。物质在加热的时候,粒子间的布朗运动增强,到达一定强度后,固体物质转化为液态,这个时候再进行退火,粒子热运动减弱,并逐渐趋于有序,最后达到稳定。
模拟退火的解不再像局部搜索那样最后的结果依赖初始点。它引入了一个接受概率p。如果新的点(设为pn)的目标函数f(pn)更好,则p=1,表示选取新点;否则,接受概率p是当前点(设为pc)的目标函数f(pc),新点的目标函数f(pn)以及另一个控制参数“温度”T的函数。也就是说,模拟退火没有像局部搜索那样每次都贪婪地寻找比现在好的点,目标函数差一点的点也有可能接受进来。随着算法的执行,系统温度T逐渐降低,最后终止于某个低温,在该温度下,系统不再接受变化。
模拟退火的典型特征是除了接受目标函数的改进外,还接受一个衰减极限,当T较大时,接受较大的衰减,当T逐渐变小时,接受较小的衰减,当T为0时,就不再接受衰减。这一特征意味着模拟退火与局部搜索相反,它能避开局部极小,并且还保持了局部搜索的通用性和简单性。
在物理上,先加热,让分子间互相碰撞,变成无序状态,内能加大,然后降温,最后的分子次序反而会更有序,内能比没有加热前更小。就像那只兔子,它喝醉后,对比较近的山峰视而不见,迷迷糊糊地跳一大圈子,反而更有可能找到珠峰。
值得注意的是,当T为0时,模拟退火就成为局部搜索的一个特例。
模拟退火的伪码表达:
procere simulated annealing
begin
t:=0;
initialize temperature T
select a current string vc at random;
evaluate vc;
repeat
repeat
select a new string vn in the neighborhood of vc; (1)
if f(vc)<f(vn)
then vc:=vn;
else if random [0,1] <exp ((f (vn)-f (vc))/T) (2)
then vc:=vn;
until (termination-condition) (3)
T:=g(T,t); (4)
T:=t+1;
until (stop-criterion) (5)
end;
上面的程序中,关键的是(1)新状态产生函数,(2)新状态接受函数,(3)抽样稳定准则,(4)退温函数,(5)退火结束准则(简称三函数两准则)是直接影响优化结果的主要环节。虽然实验结果证明初始值对于最后的结果没有影响,但是初温越高,得到高质量解的概率越大。所以,应该尽量选取比较高的初温。
上面关键环节的选取策略:
(1)状态产生函数:候选解由当前解的邻域函数决定,可以取互换,插入,逆序等操作产生,然后根据概率分布方式选取新的解,概率可以取均匀分布、正态分布、高斯分布、柯西分布等。
(2)状态接受函数:这个环节最关键,但是,实验表明,何种接受函数对于最后结果影响不大。所以,一般选取min [1, exp ((f (vn)-f (vc))/T)]。
(3)抽样稳定准则:一般常用的有:检验目标函数的均值是否稳定;连续若干步的目标值变化较小;规定一定的步数;
(4)退温函数:如果要求温度必须按照一定的比率下降,SA算法可以采用,但是温度下降很慢;快速SA中,一般采用 。目前,经常用的是 ,是一个不断变化的值。
(5)退火结束准则:一般有:设置终止温度;设置迭代次数;搜索到的最优值连续多次保持不变;检验系统熵是否稳定。
为了保证有比较优的解,算法往往采取慢降温、多抽样、以及把“终止温度”设的比较低等方式,导致算法运行时间比较长,这也是模拟退火的最大缺点。人喝醉了酒办起事来都不利索,何况兔子? “物竞天择,适者生存”,是进化论的基本思想。遗传算法就是模拟自然界想做的事。遗传算法可以很好地用于优化问题,若把它看作对自然过程高度理想化的模拟,更能显出它本身的优雅——虽然生存竞争是残酷的。
遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。作为一种新的全局优化搜索算法,遗传算法以其简单通用、健壮性强、适于并行处理以及高效、实用等显着特点,在各个领域得到了广泛应用,取得了良好效果,并逐渐成为重要的智能算法之一。
遗传算法的伪码:
procere genetic algorithm
begin
initialize a group and evaluate the fitness value ; (1)
while not convergent (2)
begin
select; (3)
if random[0,1]<pc then
crossover; (4)
if random (0,1)<pm then
mutation; (5)
end;
end
上述程序中有五个重要的环节:
(1)编码和初始群体的生成:GA在进行搜索之前先将解空间的解数据表示成遗传空间的基因型串结构数据,这些串结构数据的不同组合便构成了不同的点。然后随机产生N个初始串结构数据,每个串结构数据称为一个个体, N个体构成了一个群体。GA以这N个串结构数据作为初始点开始迭代。
比如,旅行商问题中,可以把商人走过的路径进行编码,也可以对整个图矩阵进行编码。编码方式依赖于问题怎样描述比较好解决。初始群体也应该选取适当,如果选取的过小则杂交优势不明显,算法性能很差(数量上占了优势的老鼠进化能力比老虎强),群体选取太大则计算量太大。
(2)检查算法收敛准则是否满足,控制算法是否结束。可以采用判断与最优解的适配度或者定一个迭代次数来达到。
(3)适应性值评估检测和选择:适应性函数表明个体或解的优劣性,在程序的开始也应该评价适应性,以便和以后的做比较。不同的问题,适应性函数的定义方式也不同。根据适应性的好坏,进行选择。选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁殖子孙。遗传算法通过选择过程体现这一思想,进行选择的原则是适应性强的个体为下一代贡献一个或多个后代的概率大。选择实现了达尔文的适者生存原则。
(4)杂交:按照杂交概率(pc)进行杂交。杂交操作是遗传算法中最主要的遗传操作。通过杂交操作可以得到新一代个体,新个体组合了其父辈个体的特性。杂交体现了信息交换的思想。
可以选定一个点对染色体串进行互换,插入,逆序等杂交,也可以随机选取几个点杂交。杂交概率如果太大,种群更新快,但是高适应性的个体很容易被淹没,概率小了搜索会停滞。
(5)变异:按照变异概率(pm)进行变异。变异首先在群体中随机选择一个个体,对于选中的个体以一定的概率随机地改变串结构数据中某个串的值。同生物界一样,GA中变异发生的概率很低。变异为新个体的产生提供了机会。
变异可以防止有效基因的缺损造成的进化停滞。比较低的变异概率就已经可以让基因不断变更,太大了会陷入随机搜索。想一下,生物界每一代都和上一代差距很大,会是怎样的可怕情形。
就像自然界的变异适和任何物种一样,对变量进行了编码的遗传算法没有考虑函数本身是否可导,是否连续等性质,所以适用性很强;并且,它开始就对一个种群进行操作,隐含了并行性,也容易找到“全局最优解”。 为了找到“全局最优解”,就不应该执着于某一个特定的区域。局部搜索的缺点就是太贪婪地对某一个局部区域以及其邻域搜索,导致一叶障目,不见泰山。禁忌搜索就是对于找到的一部分局部最优解,有意识地避开它(但不是完全隔绝),从而获得更多的搜索区间。兔子们找到了泰山,它们之中的一只就会留守在这里,其他的再去别的地方寻找。就这样,一大圈后,把找到的几个山峰一比较,珠穆朗玛峰脱颖而出。
当兔子们再寻找的时候,一般地会有意识地避开泰山,因为他们知道,这里已经找过,并且有一只兔子在那里看着了。这就是禁忌搜索中“禁忌表(tabu list)”的含义。那只留在泰山的兔子一般不会就安家在那里了,它会在一定时间后重新回到找最高峰的大军,因为这个时候已经有了许多新的消息,泰山毕竟也有一个不错的高度,需要重新考虑,这个归队时间,在禁忌搜索里面叫做“禁忌长度(tabu length)”;如果在搜索的过程中,留守泰山的兔子还没有归队,但是找到的地方全是华北平原等比较低的地方,兔子们就不得不再次考虑选中泰山,也就是说,当一个有兔子留守的地方优越性太突出,超过了“best to far”的状态,就可以不顾及有没有兔子留守,都把这个地方考虑进来,这就叫“特赦准则(aspiration criterion)”。这三个概念是禁忌搜索和一般搜索准则最不同的地方,算法的优化也关键在这里。
伪码表达:
procere tabu search;
begin
initialize a string vc at random,clear up the tabu list;
cur:=vc;
repeat
select a new string vn in the neighborhood of vc;
if va>best_to_far then {va is a string in the tabu list}
begin
cur:=va;
let va take place of the oldest string in the tabu list;
best_to_far:=va;
end else
begin
cur:=vn;
let vn take place of the oldest string in the tabu list;
end;
until (termination-condition);
end;
以上程序中有关键的几点:
(1)禁忌对象:可以选取当前的值(cur)作为禁忌对象放进tabu list,也可以把和当然值在同一“等高线”上的都放进tabu list。
(2)为了降低计算量,禁忌长度和禁忌表的集合不宜太大,但是禁忌长度太小容易循环搜索,禁忌表太小容易陷入“局部极优解”。
(3)上述程序段中对best_to_far的操作是直接赋值为最优的“解禁候选解”,但是有时候会出现没有大于best_to_far的,候选解也全部被禁的“死锁”状态,这个时候,就应该对候选解中最佳的进行解禁,以能够继续下去。
(4)终止准则:和模拟退火,遗传算法差不多,常用的有:给定一个迭代步数;设定与估计的最优解的距离小于某个范围时,就终止搜索;当与最优解的距离连续若干步保持不变时,终止搜索;
禁忌搜索是对人类思维过程本身的一种模拟,它通过对一些局部最优解的禁忌(也可以说是记忆)达到接纳一部分较差解,从而跳出局部搜索的目的。 人工神经网络(Artificial Neural Network,ANN)
神经网络从名字就知道是对人脑的模拟。它的神经元结构,它的构成与作用方式都是在模仿人脑,但是也仅仅是粗糙的模仿,远没有达到完美的地步。和冯·诺依曼机不同,神经网络计算非数字,非精确,高度并行,并且有自学习功能。
生命科学中,神经细胞一般称作神经元,它是整个神经结构的最基本单位。每个神经细胞就像一条胳膊,其中像手掌的地方含有细胞核,称作细胞体,像手指的称作树突,是信息的输入通路,像手臂的称作轴突,是信息的输出通路;神经元之间错综复杂地连在一起,互相之间传递信号,而传递的信号可以导致神经元电位的变化,一旦电位高出一定值,就会引起神经元的激发,此神经元就会通过轴突传出电信号。
而如果要用计算机模仿生物神经,就需要人工的神经网络有三个要素:(1)形式定义人工神经元;(2)给出人工神经元的连接方式,或者说给出网络结构;(3)给出人工神经元之间信号强度的定义。
历史上第一个人工神经网络模型称作M-P模型,非常简单:
其中,表示神经元i在t时刻的状态,为1表示激发态,为0表示抑制态;是神经元i和j之间的连接强度;表示神经元i的阈值,超过这个值神经元才能激发。
这个模型是最简单的神经元模型。但是功能已经非常强大:此模型的发明人McCulloch和Pitts已经证明,不考虑速度和实现的复杂性,它可以完成当前数字计算机的任何工作。
以上这个M-P模型仅仅是一层的网络,如果从对一个平面进行分割的方面来考虑的话,M-P网络只能把一个平面分成个半平面,却不能够选取特定的一部分。而解决的办法就是“多层前向网路”。
为了让这种网络有合适的权值,必须给网络一定的激励,让它自己学习,调整。一种方法称作“向后传播算法(Back Propagation,BP)”,其基本思想是考察最后输出解和理想解的差异,调整权值,并把这种调整从输出层开始向后推演,经过中间层,达到输入层。
可见,神经网络是通过学习来达到解决问题的目的,学习没有改变单个神经元的结构和工作方式,单个神经元的特性和要解决的问题之间也没有直接联系,这里学习的作用是根据神经元之间激励与抑制的关系,改变它们的作用强度。学习样本中的任何样品的信息都包含在网络的每个权值之中。
BP算法中有考察输出解和理想解差异的过程,假设差距为w,则调整权值的目的就是为了使得w最小化。这就又包含了前文所说的“最小值”问题。一般的BP算法采用的是局部搜索,比如最速下降法,牛顿法等,当然如果想要得到全局最优解,可以采用模拟退火,遗传算法等。当前向网络采用模拟退火算法作为学习方法的时候,一般成为“波尔兹曼网络”,属于随机性神经网络。
在学习BP算法学习的过程中,需要已经有一部分确定的值作为理想输出,这就好像中学生在学习的时候,有老师的监督。如果没有了监督,人工神经网络该怎么学习?
就像没有了宏观调控,自由的市场引入了竞争一样,有一种学习方法称作“无监督有竞争的学习”。在输入神经元i的若干个神经元之间开展竞争,竞争之后,只有一个神经元为1,其他均为0,而对于失败的神经元,调整使得向对竞争有利的方向移动,则最终也可能在一次竞争中胜利;
人工神经网络还有反馈网络如Hopfield网络,它的神经元的信号传递方向是双向的,并且引入一个能量函数,通过神经元之间不断地相互影响,能量函数值不断下降,最后能给出一个能量比较低的解。这个思想和模拟退火差不多。
人工神经网络应用到算法上时,其正确率和速度与软件的实现联系不大,关键的是它自身的不断学习。这种思想已经和冯·诺依曼模型很不一样。 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。
PSO同遗传算法类似,是一种基于迭代的优化算法。系统初始化为一组随机解,通过迭代搜寻最优值。但是它没有遗传算法用的交叉(crossover)以及变异(mutation),而是粒子在解空间追随最优的粒子进行搜索。同遗传算法比较,PSO的优势在于简单容易实现并且没有许多参数需要调整。目前已广泛应用于函数优化,神经网络训练,模糊系统控制以及其他遗传算法的应用领域。
PSO模拟鸟群的捕食行为。设想这样一个场景:一群鸟在随机搜索食物。在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢。最简单有效的就是搜寻目前离食物最近的鸟的周围区域。
PSO从这种模型中得到启示并用于解决优化问题。PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitness value),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空间中搜索。
PSO 初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个极值来更新自己。第一个就是粒子本身所找到的最优解,这个解叫做个体极值pBest。另一个极值是整个种群目前找到的最优解,这个极值是全局极值gBest。另外也可以不用整个种群而只是用其中一部分作为粒子的邻居,那么在所有邻居中的极值就是局部极值。 模拟退火,遗传算法,禁忌搜索,神经网络在解决全局最优解的问题上有着独到的优点,并且,它们有一个共同的特点:都是模拟了自然过程。模拟退火思路源于物理学中固体物质的退火过程,遗传算法借鉴了自然界优胜劣汰的进化思想,禁忌搜索模拟了人类有记忆过程的智力过程,神经网络更是直接模拟了人脑。
它们之间的联系也非常紧密,比如模拟退火和遗传算法为神经网络提供更优良的学习算法提供了思路。把它们有机地综合在一起,取长补短,性能将更加优良。
这几种智能算法有别于一般的按照图灵机进行精确计算的程序,尤其是人工神经网络,是对计算机模型的一种新的诠释,跳出了冯·诺依曼机的圈子,按照这种思想来设计的计算机有着广阔的发展前景
㈦ 数据挖掘算法的算法分类
C4.5就是一个决策树算法,它是决策树(决策树也就是做决策的节点间像一棵树一样的组织方式,其实是一个倒树)核心算法ID3的改进算法,所以基本上了解了一半决策树构造方法就能构造它。决策树构造方法其实就是每次选择一个好的特征以及分裂点作为当前节点的分类条件。C4.5比ID3改进的地方时:
ID3选择属性用的是子树的信息增益(这里可以用很多方法来定义信息,ID3使用的是熵(entropy)(熵是一种不纯度度量准则)),也就是熵的变化值,而C4.5用的是信息增益率。也就是多了个率嘛。一般来说率就是用来取平衡用的,就像方差起的作用差不多,比如有两个跑步的人,一个起点是100m/s的人、其1s后为110m/s;另一个人起速是1m/s、其1s后为11m/s。如果仅算差值那么两个就是一样的了;但如果使用速度增加率(加速度)来衡量,2个人差距就很大了。在这里,其克服了用信息增益选择属性时偏向选择取值多的属性的不足。在树构造过程中进行剪枝,我在构造决策树的时候好讨厌那些挂着几个元素的节点。对于这种节点,干脆不考虑最好,不然很容易导致overfitting。对非离散数据都能处理,这个其实就是一个个式,看对于连续型的值在哪里分裂好。也就是把连续性的数据转化为离散的值进行处理。能够对不完整数据进行处理,这个重要也重要,其实也没那么重要,缺失数据采用一些方法补上去就是了。 (朴素贝叶斯NB)
NB认为各个特征是独立的,谁也不关谁的事。所以一个样本(特征值的集合,比如“数据结构”出现2次,“文件”出现1次),可以通过对其所有出现特征在给定类别的概率相乘。比如“数据结构”出现在类1的概率为0.5,“文件”出现在类1的概率为0.3,则可认为其属于类1的概率为0.5*0.5*0.3。 (支持向量机SVM)
SVM就是想找一个分类得最”好”的分类线/分类面(最近的一些两类样本到这个”线”的距离最远)。这个没具体实现过,上次听课,那位老师自称自己实现了SVM,敬佩其钻研精神。常用的工具包是LibSVM、SVMLight、MySVM。 (Mining frequent patterns without candidate generation)
这个也不太清楚。FP-growth算法(Frequent Pattern-growth)使用了一种紧缩的数据结构来存储查找频繁项集所需要的全部信息。采用算法:将提供频繁项集的数据库压缩到一棵FP-tree来保留项集关联信息,然后将压缩后的数据库分成一组条件数据库(一种特殊类型的投影数据库),每个条件数据库关联一个频繁项集。 K-Means是一种最经典也是使用最广泛的聚类方法,时至今日扔然有很多基于其的改进模型提出。K-Means的思想很简单,对于一个聚类任务(你需要指明聚成几个类,当然按照自然想法来说不应该需要指明类数,这个问题也是当前聚类任务的一个值得研究的课题),首先随机选择K个簇中心,然后反复计算下面的过程直到所有簇中心不改变(簇集合不改变)为止:步骤1:对于每个对象,计算其与每个簇中心的相似度,把其归入与其最相似的那个簇中。
步骤2:更新簇中心,新的簇中心通过计算所有属于该簇的对象的平均值得到。
k-means 算法的工作过程说明如下:首先从n个数据对象任意选择k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。一般都采用均方差作为标准测度函数. k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。 BIRCH也是一种聚类算法,其全称是Balanced Iterative Recing and Clustering using Hierarchies。BIRCH也是只是看了理论没具体实现过。是一个综合的层次聚类特征(Clustering Feature, CF)和聚类特征树(CF Tree)两个概念,用于概括聚类描述。聚类特征树概括了聚类的有用信息,并且占用空间较元数据集合小得多,可以存放在内存中,从而可以提高算法在大型数据集合上的聚类速度及可伸缩性。
BIRCH算法包括以下两个阶段:
1)扫描数据库,建立动态的一棵存放在内存的CF Tree。如果内存不够,则增大阈值,在原树基础上构造一棵较小的树。
2)对叶节点进一步利用一个全局性的聚类算法,改进聚类质量。
由于CF Tree的叶节点代表的聚类可能不是自然的聚类结果,原因是给定的阈值限制了簇的大小,并且数据的输入顺序也会影响到聚类结果。因此需要对叶节点进一步利用一个全局性的聚类算法,改进聚类质量。 AdaBoost做分类的一般知道,它是一种boosting方法。这个不能说是一种算法,应该是一种方法,因为它可以建立在任何一种分类算法上,可以是决策树,NB,SVM等。
Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。使用adaboost分类器可以排除一些不必要的训练数据,并将关键放在关键的训练数据上面。 GSP,全称为Generalized Sequential Pattern(广义序贯模式),是一种序列挖掘算法。对于序列挖掘没有仔细看过,应该是基于关联规则的吧!网上是这样说的:
GSP类似于Apriori算法,采用冗余候选模式的剪除策略和特殊的数据结构-----哈希树来实现候选模式的快速访存。
GSP算法描述:
1)扫描序列数据库,得到长度为1的序列模式L1,作为初始的种子集。
2)根据长度为i 的种子集Li ,通过连接操作和修剪操作生成长度为i+1的候选序列模式Ci+1;然后扫描序列数据库,计算每个候选序列模式的支持度,产生长度为i+1的序列模式Li+1,并将Li+1作为新的种子集。
3)重复第二步,直到没有新的序列模式或新的候选序列模式产生为止。
产生候选序列模式主要分两步:
连接阶段:如果去掉序列模式s1的第一个项目与去掉序列模式s2的最后一个项目所得到的序列相同,则可以将s1与s2进行连接,即将s2的最后一个项目添加到s1中。
修切阶段:若某候选序列模式的某个子序列不是序列模式,则此候选序列模式不可能是序列模式,将它从候选序列模式中删除。
候选序列模式的支持度计算:对于给定的候选序列模式集合C,扫描序列数据库,对于其中的每一条序列s,找出集合C中被s所包含的所有候选序列模式,并增加其支持度计数。 又是一个类似Apriori的序列挖掘。
其中经典十大算法为:C4.5,K-Means,SVM,Apriori,EM,PageRank,AdaBoost,KNN,NB和CART。
㈧ 什么是最小均方差准则
【最小均方差准则】就是均方误差最小准则。即选择一组时域采样值,采用最小均方误差算法(自适应算法的一种),以使均方误差最小,从而达到最优化设计。这一方法注重的是在整个频率区间内,总误差全局最小,但不能保证局部频率点的性能,有些频点可能会有较大的误差。
【自适应算法】是指处理和分析过程中,根据处理数据的数据特征自动调整处理方法、处理顺序、处理参数、边界条件或约束条件,使其与所处理数据的统计分布特征、结构特征相适应,以取得最佳的处理效果。自适应过程是一个不断逼近目标的过程。它所遵循的途径以数学模型表示,称为自适应算法。通常采用基于梯度的算法,其中最小均方误差算法(即LMS算法)尤为常用。
㈨ 经典的自适应均衡器准则或算法有哪些
迫零算法(ZF)、最小均方误差算法(LMS)、递推最小二乘算法(RLS)、卡尔曼算法等。