
基本Kmeans算法实现 C++代码
#include <iostream>#include <sstream>
#include <fstream>
#include <vector>
#include <math.h>
#include <stdlib.h>
#define k 3//簇的数目
using namespace std
//存放元组的属性信息
typedef vector<double> Tuple//存储每条数据记录
int dataNum//数据集中数据记录数目
int dimNum//每条记录的维数
//计算两个元组间的欧几里距离
double getDistXY(const Tuple& t1, const Tuple& t2)
{
double sum = 0
for(int i=1 i<=dimNum ++i)
{
sum += (t1[i]-t2[i]) * (t1[i]-t2[i])
}
return sqrt(sum)
}
//根据质心,决定当前元组属于哪个簇
int clusterOfTuple(Tuple means[],const Tuple& tuple){
double dist=getDistXY(means[0],tuple)
double tmp
int label=0//标示属于哪一个簇
for(int i=1i<ki++){
tmp=getDistXY(means[i],tuple)
if(tmp<dist) {dist=tmplabel=i}
}
return label
}
//获得给定簇集的平方误差
double getVar(vector<Tuple> clusters[],Tuple means[]){
double var = 0
for (int i = 0 i < k i++)
{
vector<Tuple> t = clusters[i]
for (int j = 0 j< t.size() j++)
{
var += getDistXY(t[j],means[i])
}
}
//cout<<"sum:"<<sum<<endl
return var
}
//获得当前簇的均值(质心)
Tuple getMeans(const vector<Tuple>& cluster){
int num = cluster.size()
Tuple t(dimNum+1, 0)
for (int i = 0 i < num i++)
{
for(int j=1 j<=dimNum ++j)
{
t[j] += cluster[i][j]
}
}
for(int j=1 j<=dimNum ++j)
t[j] /= num
return t
//cout<<"sum:"<<sum<<endl
}
void print(const vector<Tuple> clusters[])
{
for(int lable=0 lable<k lable++)
{
cout<<"第"<<lable+1<<"个簇:"<<endl
vector<Tuple> t = clusters[lable]
for(int i=0 i<t.size() i++)
{
cout<<i+1<<".("
for(int j=0 j<=dimNum ++j)
{
cout<<t[i][j]<<", "
}
cout<<")\n"
}
}
}
void KMeans(vector<Tuple>& tuples){
vector<Tuple> clusters[k]//k个簇
Tuple means[k]//k个中心点
int i=0
//一开始随机选取k条记录的值作为k个簇的质心(均值)
srand((unsigned int)time(NULL))
for(i=0i<k){
int iToSelect = rand()%tuples.size()
if(means[iToSelect].size() == 0)
{
for(int j=0 j<=dimNum ++j)
{
means[i].push_back(tuples[iToSelect][j])
}
++i
}
}
int lable=0
//根据默认的质心给簇赋值
for(i=0i!=tuples.size()++i){
lable=clusterOfTuple(means,tuples[i])
clusters[lable].push_back(tuples[i])
}
double oldVar=-1
double newVar=getVar(clusters,means)
cout<<"初始的的整体误差平方和为:"<<newVar<<endl
int t = 0
while(abs(newVar - oldVar) >= 1) //当新旧函数值相差不到1即准则函数值不发生明显变化时,算法终止
{
cout<<"第 "<<++t<<" 次迭代开始:"<<endl
for (i = 0 i < k i++) //更新每个簇的中心点
{
means[i] = getMeans(clusters[i])
}
oldVar = newVar
newVar = getVar(clusters,means) //计算新的准则函数值
for (i = 0 i < k i++) //清空每个簇
{
clusters[i].clear()
}
//根据新的质心获得新的簇
for(i=0 i!=tuples.size() ++i){
lable=clusterOfTuple(means,tuples[i])
clusters[lable].push_back(tuples[i])
}
cout<<"此次迭代之后的整体误差平方和为:"<<newVar<<endl
}
cout<<"The result is:\n"
print(clusters)
}
int main(){
char fname[256]
cout<<"请输入存放数据的文件名: "
cin>>fname
cout<<endl<<" 请依次输入: 维数 样本数目"<<endl
cout<<endl<<" 维数dimNum: "
cin>>dimNum
cout<<endl<<" 样本数目dataNum: "
cin>>dataNum
ifstream infile(fname)
if(!infile){
cout<<"不能打开输入的文件"<<fname<<endl
return 0
}
vector<Tuple> tuples
//从文件流中读入数据
for(int i=0 i<dataNum && !infile.eof() ++i)
{
string str
getline(infile, str)
istringstream istr(str)
Tuple tuple(dimNum+1, 0)//第一个位置存放记录编号,第2到dimNum+1个位置存放实际元素
tuple[0] = i+1
for(int j=1 j<=dimNum ++j)
{
istr>>tuple[j]
}
tuples.push_back(tuple)
}
cout<<endl<<"开始聚类"<<endl
KMeans(tuples)
return 0
}
.........\Ada_Boost.mfunction D = ada_boost(train_features, train_targets, params, region)
% Classify using the AdaBoost algorithm
% Inputs:
% features - Train features
% targets - Train targets
% Params - [NumberOfIterations, Weak Learner Type, Learner's parameters]
% region - Decision region vector: [-x x -y y number_of_points]
%
% Outputs
% D - Decision sufrace
%
% NOTE: This algorithm is very tuned to the 2D nature of the toolbox!
[k_max, weak_learner, alg_param] = process_params(params)
[Ni,M] = size(train_features)
D = zeros(region(5))
W = ones(1,M)/M
IterDisp = 10
%Find where the training features fall on the decision grid
N = region(5)
mx = ones(N,1) * linspace (region(1),region(2),N)
my = linspace (region(3),region(4),N)' * ones(1,N)
flatxy = [mx(:), my(:)]'
train_loc = zeros(1,M)
for i = 1:M,
dist = sqrt(sum((flatxy - train_features(:,i)*ones(1,N^2)).^2))
[m, train_loc(i)] = min(dist)
end
%Do the AdaBoosting
for k = 1:k_max,
%Train weak learner Ck using the data sampled according to W:
%...so sample the data according to W
randnum = rand(1,M)
cW= cumsum(W)
indices = zeros(1,M)
for i = 1:M,
%Find which bin the random number falls into
loc = max(find(randnum(i) >cW))+1
if isempty(loc)
indices(i) = 1
else
indices(i) = loc
end
end
%...and now train the classifier
Ck = feval(weak_learner, train_features(:, indices), train_targets(indices), alg_param, region)
Ckl = Ck(:)
%Ek <- Training error of Ck
Ek = sum(W.*(Ckl(train_loc)' ~= train_targets))
if (Ek == 0),
break
end
%alpha_k <- 1/2*ln(1-Ek)/Ek)
alpha_k = 0.5*log((1-Ek)/Ek)
%W_k+1 = W_k/Z*exp(+/-alpha)
W = W.*exp(alpha_k*(xor(Ckl(train_loc)',train_targets)*2-1))
W = W./sum(W)
%Update the decision region
D = D + alpha_k*(2*Ck-1)
if (k/IterDisp == floor(k/IterDisp)),
disp(['Completed ' num2str(k) ' boosting iterations'])
end
end
D = D>
vss是什么意思 vss相关含义全称: Visual Source Safe
任务: 负责项目文件的管理
适用于: 负责项目文件的管理
概述: VSS 的全称为 Visual Source Safe 。作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责项目文件的管理,几乎可以适用任何软件项目。管理软件开发中各个不同版本的源代码和文档,占用空间小并且方便各个版本代码和文档的获取,对开发小组中对源代码的访问进行有效的协调。
基本介绍
1.VSS
VSS 即 Var Sect Sweep, 就是可变剖面扫描,也就是常说的 变截面扫描,是PROE的一种建模工具。
2. Cisco VSS
既虚拟交换系统是一种网络系统虚拟化技术,将两台Cisco® Catalyst®6500E/7600系列交换机组合为单一虚拟交换机,从而提高运营效率、增强不间断通信,并将系统带宽容量扩展到1.4Tbps。在初始阶段,VSS将使两台物理Cisco Catalyst 6500系列交换机作为单一逻辑虚拟交换机运行,称为虚拟交换系统 1440(VSS1440)。
3.VSS ------Volume Shadow copy Service
VSS (Volume Shadow copy Service, 卷映射拷贝服务),最初是在Windows Server 2003 SP1中引入的存储技术。它通过在卷管理模块上加入快照功能,在此基础上就可以创建基于时间点(Point-In-Time)的映像(Image),从而实现数据的快速备份和恢复,用户也无需害怕因无意删除数据而造成的困扰,这就是VSS的关键所在。由于VSS所表现的优良特性,因此在Microsoft最新的Vista *** 作系统中,也加入了该功能。
VSS能够让存储基础设备(比如磁盘、阵列)创建高保真的时间点映像,就是映射拷贝(Shadow Copy)。它可以在多卷、或者单个卷上创建映射拷贝,同时不会影响到系统性能。VSS通过协调业务应用软件、备份程序,以及存储硬件,从而达到创建高保真映射拷贝的能力。它可以应用到以下领域:
A、 快速数据备份和恢复
B、 针对制定文件的恢复
C、 磁带备份、测试,以及数据挖掘方面
由于Microsoft在OS中集成了VSS技术,它将各个处理功能模块化,并针对存储软硬件厂商提供相应的开发接口开发商只需要关注自己的模块,根据需求设计相关的应用,从而减少了整体设计的难度。就笔者了解,不少软硬件存储公司就采用VSS技术来设计NAS,并以此为基础构建数据保护服务器。
VSS整体框架包含了VSS核心模块、请求者(Requestor)、写入者(Writer),以及提供者(Provider)。
电路符号
在电子电路中,VSS / VDD /VCC这些为电子电路符号。VSS的V还是电压,S是:Series,表示公共连接(一般就是接地)或电源负极。VSS的意思是接地电压(接地点电位视为0)。在“场效应”即CMOS元件中,VDD乃CMOS的漏极引脚,VSS乃CMOS的源极引脚。
另外,VCC:C=circuit 表示电路的意思, 即接入电路的电压(电路的供电电压), D=device 表示器件的意思, 即器件内部的工作电压(芯片的工作电压),在普通的电子电路中,一般Vcc>Vdd !。
运行环境
Windows平台下使用VSS开发的典型环境是基于C/S架构的,即开发小组的每个开发者在各自的Windows平台下利用开发工具(比如VC)开发项目中的各个模块,而配有专门的服务器集中控制开发过程中的文档和代码。服务器和开发人员的客户机分别装有VSS的服务器和客户端程序。
使用说明
VSS使用过程中要遵循的是lock-modify-unlock流程而不是 copy-modify-merge流程(比如CVS),即开发人员首先将自己要修改源代码和文档从VSS服务器主备份文件上checkout到本地同时锁定服务器上的源代码和文档(multi - checkout情况除外),修改完成后checkin到服务器上同时解除服务器上文件的锁定。服务器集中控制所有的源程序和文档。
VSS使用中涉及到的概念
1) 项目(project),所谓的项目是一组存在VSS中的文件(任何类型),可以在项目中或是项目之间进行文件的添加、删除、我和共享。一个项目与 *** 作系统的文件夹有很多的相似之处,但它更好地支持文件合并、历史和版本控制。所有的文件存在VSS数据库的项目中,开发组成员不能在VSS中的服务器主备份文件上工作(除了检查和版本比对等特殊情况外)而是VSS为每个成员在各自的工作目录(workfolder)下提供一个拷贝以供工作。尽管在没有工作目录的情况下也可以查看某个文件,但如要真正在VSS管理下工作,就必须要创建一个工作目录。
2) 工作目录(workfolder)是用户真正对项目文件进行调试修改的地方,当用户checkout文件时,VSS将就将文件拷贝到用户的工作目录下,当用户修改了该文件并将其checkin时,VSS再将它从用户的工作目录拷回到VSS 的数据库中。在用户作checkout时,VSS将会自动管理他的工作目录,诸如创建必要的子目录。而且工作目录可以随时创建或修改。
3) 版本跟踪。VSS提供版本控制和历史服务,而且老版本程序和文档能够被重新得到以便进行bug跟踪或其他目的。VSS用日期/时间戳来记录文件是何时被checkout或是何时被修改的,它主要有三种方法来跟踪文件和项目的版本:
版本号:这是由VSS维护的内部数码,用户对它没有控制权。每个文件和项目的每个版本都有一个版本号,这些版本号总是一个整数且是递增的。
标签(label):这些是用户赋给某个项目或文件的某个版本的一个字符串,可以是任何格式的长度不超过31字符的字符串。推荐使用。
日期/时间戳:它给出了一个文件何时最后被修改的信息,或者是一个文件何时被checkin。VSS同时支持 12小时和24小时的时间格式。
具体作用
源代码版本控制机制是现代软件开发中必不可少的管理机制之一,通常借助版本控制软件即Source Code Management(SCM) systems或者Version Control systems来实现。版本控制在软件开发中的重要作用如下:
1)作为代码仓库有效的管理软件开发中各个不同版本的源代码和文档,占用空间小并且方便各个版本代码和文档的获取。
2)对开发小组中对源代码的访问进行有效的协调(不同的版本控制软件采取不同的协调策略)。
常用的版本控制软件有Clearcase, CVS, PVCS和Microsoft公司的Visual SourceSafe (VSS)。下面对Windows平台开发最常用的Visual SourceSafe 6.0进行简单介绍。
注意事项
一定要选中Recursive复选框以保证所有子文件夹被checkin。
建议1
在实际使用过程中,开发人员或者管理员有责任对服务器上的源程序和文档定期或不定期的做相应Label,以方便源程序和文档历史版本的管理。VSS可以方便的根据Label获取各个历史版本(有其他获取历史版本的方式,本文推荐使用Label方法)。
添加Label。选中要添加Label的目录(project)单击右键选中Label…
设置Label对话框中填入Label名称和相关Comment,如下图所示
如果要获取某一历史版本,选中相应的目录(project)并选择Show History…,如下图所示选择相应复选框并单击OK
VSSd出下面对话框,其中列出了所有管理员所作的Label,选中相应的Label,然后单击Get按钮则做Label的相应版本就会checkout到本地工作目录中。其他按钮的使用参见帮助
建议2
开发人员请不要随意变更VSS服务器上的目录(project)结构,不要在目录(project)中随便增加删除文件,不要随便访问他人目录(project)及文件。如服务器上目录(project)结构确实需要变化请与管理员联系。
建议3
严格遵守VSS的使用规程,防止因误 *** 作导致程序或者文档的丢失。如遇两人需同时修改统一目录(project)或文件的情况,请串行处理而非multicheckout方式处理以减少出错几率。
版本控制是工作组软件开发中的重要方面,它能防止意外的文件丢失、允许反追踪到早期版本、并能对版本进行分支、合并和管理。在软件开发和您需要比较两种版本的文件或找回早期版本的文件时,源代码的控制是非常有用的。
Visual SourceSafe 是一种源代码控制系统,它提供了完善的版本和配置管理功能,以及安全保护和跟踪检查功能。VSS通过将有关项目文档(包括文本文件、图象文件、二进制文件、声音文件、视屏文件)存入数据库进行项目研发管理工作。用户可以根据需要随时快速有效地共享文件。文件一旦被添加进VSS,它的每次改动都会被记录下来,用户可以恢复文件的早期版本,项目组的其他成员也可以看到有关文档的最新版本,并对它们进行修改,VSS也同样会将新的改动记录下来。你还会发现,用 VSS来组织管理项目,使得项目组间的沟通与合作更简易而且直观。
其他相关含义
一、狙击步q
VSS“绞丝机”(俄文:ВСС“Винторез”)实为AS“巨浪”特种突击步q的狙击型(尽管AS也被常被当作狙击步q使用),VSS是Vinovka Snaiperskaja Spetsialnaya即“特种狙击步q”的缩写,与AS一样也是中央精密机械工程研究院的谢尔久科夫小组为特种部队研制的。主要使用SP-6穿甲d,SP-5普通d也能用。与AS结构原理完全相同,外形区别只是VSS取消了独立小握把,改为框架式的木制运动型q托,q托底部有橡胶底板。与AS通用d匣,但在VSS上标配的是10发d匣。
已装备俄罗斯的特种部队与执法机构行动单位,广泛应用于独联体各地的武装冲突。
二、战争前线
威力是全自动狙击步q中最大的,达到200,自带消音器(没自带消音器的q安装消音器会减威力),射程也是
全自动狙击步q中最远的。射速适中400,每分钟400发,后坐力小,很稳定,近距离盲打准,唯一的不足时子d只有10发,续航力不足
威力:200。(满血满甲最厚为275,最薄为225)
射程:70。(狙击q射程满就是70)
射速:400。(每分钟400发)
开镜瞄准精度:104。
直接瞄准精度:55。
装d数:10。
有句顺口溜:VSS VSS VSS狗,按住鼠标不放手,小手一点人头到手。
三、地或电源
Vdd,Vss在MOS电路中出现,和漏极(Drain),源极(Source)有关,也是一正一负。
当集成电路器件的管脚标示vss时通常表示该管脚为备用电源引脚。
四、活性污泥
VSS指活性污泥中在600摄氏度的燃烧炉中能被燃烧,并以气体逸出的那部分固体。它通常用于表示污泥中的有机物的量,常用mg/L表示,有时也用重量百分数表示。VSS也反映污泥的稳定化程度。
污泥中可挥发性固体(VSS)的测定:
仪器和实验用品
1.定量滤纸
2.马弗炉
3.烘箱
4.干燥器,备有以颜色指示的干燥剂
5.分析天平,感量0.1mg
实验步骤(括号内为实际 *** 作)
1.定量滤纸在103-105℃烘干,干燥期内冷却,称重,反复直至获得恒重或称重损失小于前次称重的4%重量为m0(干燥8小时后放入干燥器冷却后称重为最终值或Φ12.5的滤纸直接以1g计)
2.将样品100ml用1中的滤纸过滤,放入103-105℃的烘箱中烘干取出在干燥器中冷却至平衡温度称重,反复干燥制恒重或失重小于前次称重的5%或0.5mg(取较小值),重量为m1
SS=(m1- m0)/0.1(干燥8小时后放入干燥器冷却后称重为最终值)
3.将干净的坩埚放入烘箱中干燥一小时,取出放在干燥其中冷却至平衡温度,称重,重量为m2
4.将2中的滤纸和泥放在3中的坩埚中,然后放入冷的马弗炉中,加热到600℃灼烧60分钟,在干燥器中冷却并称重,m3(从温度达到600℃开始计时)
vss=[( m1+m2- m0)- m3]/0.1
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)