正文
java标准差的代码 标准差编程
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
如何用java编写naivebayes
1.关于贝叶斯分类
bayes 是一种统计学分类方法,它基于贝叶斯定理,它假定一个属性值对给定类的影响独立于其它属性点的值。该假定称作类条件独立。做次假定是为了简化所需计算,并在此意义下称为“朴素的”。
bayes分类的算法大致如下:
(1)对于属性值是离散的,并且目标label值也是离散的情况下。分别计算label不同取值的概率,以及样本在label情况下的概率值,然后将这些概率值相乘最后得到一个概率的乘积,选择概率乘积最大的那个值对应的label值就为预测的结果。
例如以下:是预测苹果在给定属性的情况是甜还是不甜的情况:
color={0,1,2,3} weight={2,3,4};是属性序列,为离散型。sweet={yes,no}是目标值,也为离散型;
这时我们要预测在color=3,weight=3的情况下的目标值,计算过程如下:
P{y=yes}=2/5=0.4; P{color=3|yes}=1/2=0.5;P{weight=3|yes}=1/2=0.5; 故F{color=3,weight=3}取yesd的概率为 0.4*0.5*0.5=0.1;
P{y=no}=3/5=0.6; P{color=3|no}=1/3 P{weight=3|no}=1/3; 故P{color=3,weight=3}取no为 0.6*1/3*1/3=1/15;
0.11/15 所以认为 F{color=3,weight=3}=yes;
(2)对于属性值是连续的情况,思想和离散是相同的,只是这时候我们计算属性的概率用的是高斯密度:
这里的Xk就是样本的取值,u是样本所在列的均值,kesi是标准差;
最后代码如下:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package auxiliary;
import java.util.ArrayList;
/**
*
* @author Michael Kong
*/
public class NaiveBayes extends Classifier {
boolean isClassfication[];
ArrayList DoublelblClass=new ArrayListDouble(); //存储目标值的种类
ArrayListIntegerlblCount=new ArrayListInteger();//存储目标值的个数
ArrayListFloatlblProba=new ArrayListFloat();//存储对应的label的概率
CountProbility countlblPro;
/*@ClassListBasedLabel是将训练数组按照 label的顺序来分类存储*/
ArrayListArrayListArrayListDouble ClassListBasedLabel=new ArrayListArrayListArrayListDouble ();
public NaiveBayes() {
}
@Override
/**
* @train主要完成求一些概率
* 1.labels中的不同取值的概率f(Yi); 对应28,29行两段代码
* 2.将训练数组按目标值分类存储 第37行代码
* */
public void train(boolean[] isCategory, double[][] features, double[] labels){
isClassfication=isCategory;
countlblPro=new CountProbility(isCategory,features,labels);
countlblPro.getlblClass(lblClass, lblCount, lblProba);
ArrayListArrayListDouble trainingList=countlblPro.UnionFeaLbl(features, labels); //union the features[][] and labels[]
ClassListBasedLabel=countlblPro.getClassListBasedLabel(lblClass, trainingList);
}
@Override
/**3.在Y的条件下,计算Xi的概率 f(Xi/Y);
* 4.返回使得Yi*Xi*...概率最大的那个label的取值
* */
public double predict(double[] features) {
int max_index; //用于记录使概率取得最大的那个索引
int index=0; //这个索引是 标识不同的labels 所对应的概率
ArrayListDouble pro_=new ArrayListDouble(); //这个概率数组是存储features[] 在不同labels下对应的概率
for(ArrayListArrayListDouble elements: ClassListBasedLabel) //依次取不同的label值对应的元祖集合
{
ArrayListDouble pro=new ArrayListDouble();//存同一个label对应的所有概率,之后其中的元素自乘
double probility=1.0; //计算概率的乘积
for(int i=0;ifeatures.length;i++)
{
if(isClassfication[i]) //用于对属性的离散还是连续做判断
{
int count=0;
for(ArrayListDouble element:elements) //依次取labels中的所有元祖
{
if(element.get(i).equals(features[i])) //如果这个元祖的第index数据和b相等,那么就count就加1
count++;
}
if(count==0)
{
pro.add(1/(double)(elements.size()+1));
}
else
pro.add(count/(double)elements.size()); //统计完所有之后 计算概率值 并加入
}
else
{
double Sdev;
double Mean;
double probi=1.0;
Mean=countlblPro.getMean(elements, i);
Sdev=countlblPro.getSdev(elements, i);
if(Sdev!=0)
{
probi*=((1/(Math.sqrt(2*Math.PI)*Sdev))*(Math.exp(-(features[i]-Mean)*(features[i]-Mean)/(2*Sdev*Sdev))));
pro.add(probi);
}
else
pro.add(1.5);
}
}
for(double pi:pro)
probility*=pi; //将所有概率相乘
probility*=lblProba.get(index);//最后再乘以一个 Yi
pro_.add(probility);// 放入pro_ 至此 一个循环结束,
index++;
}
double max_pro=pro_.get(0);
max_index=0;
for(int i=1;ipro_.size();i++)
{
if(pro_.get(i)=max_pro)
{
max_pro=pro_.get(i);
max_index=i;
}
}
return lblClass.get(max_index);
}
public class CountProbility
{
boolean []isCatory;
double[][]features;
private double[]labels;
public CountProbility(boolean[] isCategory, double[][] features, double[] labels)
{
this.isCatory=isCategory;
this.features=features;
this.labels=labels;
}
//获取label中取值情况
public void getlblClass( ArrayList DoublelblClass,ArrayListIntegerlblCount,ArrayListFloatlblProba)
{
int j=0;
for(double i:labels)
{
//如果当前的label不存在于lblClass则加入
if(!lblClass.contains(i))
{
lblClass.add(j,i);
lblCount.add(j++,1);
}
else //如果label中已经存在,就将其计数加1
{
int index=lblClass.indexOf(i);
int count=lblCount.get(index);
lblCount.set(index,++count);
}
}
for(int i=0;ilblClass.size();i++)
{
// System.out.println("值为"+lblClass.get(i)+"的个数有"+lblCount.get(i)+"概率是"+lblCount.get(i)/(float)labels.length);
lblProba.add(i,lblCount.get(i)/(float)labels.length);
}
}
//将label[]和features[][]合并
public ArrayListArrayListDouble UnionFeaLbl(double[][] features, double[] labels)
{
ArrayListArrayListDoubletraingList=new ArrayListArrayListDouble();
for(int i=0;ifeatures.length;i++)
{
ArrayListDoubleelements=new ArrayListDouble();
for(int j=0;jfeatures[i].length;j++)
{
elements.add(j,features[i][j]);
}
elements.add(features[i].length,labels[i]);
traingList.add(i,elements);
}
return traingList;
}
/*将测试数组按label的值分类存储*/
public ArrayListArrayListArrayListDouble getClassListBasedLabel (ArrayList DoublelblClass,ArrayListArrayListDoubletrainingList)
{
ArrayListArrayListArrayListDouble ClassListBasedLabel=new ArrayListArrayListArrayListDouble () ;
for(double num:lblClass)
{
ArrayListArrayListDouble elements=new ArrayListArrayListDouble();
for(ArrayListDoubleelement:trainingList)
{
if(element.get(element.size()-1).equals(num))
elements.add(element);
}
ClassListBasedLabel.add(elements);
}
return ClassListBasedLabel;
}
public double getMean(ArrayListArrayListDouble elements,int index)
{
double sum=0.0;
double Mean;
for(ArrayListDouble element:elements)
{
sum+=element.get(index);
}
Mean=sum/(double)elements.size();
return Mean;
}
public double getSdev(ArrayListArrayListDouble elements,int index)
{
double dev=0.0;
double Mean;
Mean=getMean(elements,index);
for(ArrayListDouble element:elements)
{
dev+=Math.pow((element.get(index)-Mean),2);
}
dev=Math.sqrt(dev/elements.size());
return dev;
}
}
}
数据处理,用C++或者Java编写,求一组数的方差均值众数标准差中位数等
平均数、众数、中位数这三个统计量的各自特点是:
平均数的大小与一组数据里的每个数据均有关系,其中任何数据的变动都会相应引起平均数的变动;众数则着眼于对各数据出现的次数的考察,其大小只与这组数据中的部分数据有关,当一组数据中有不少数据多次重复出现时,其众数往往是我们关心的一种统计量;中位数则仅与数据排列位置有关,当一组数据从小到大排列后,最中间的数据为中位数(偶数个数据的最中间两个的平均数)。因此某些数据的变动对它的中位数影响不大。
在同一组数据中,众数、中位数和平均数也各有其特性:
(1)中位数与平均数是唯一存在的,而众数是不唯一的;
(2)众数、中位数和平均数在一般情况下是各不相等,但在特殊情况下也可能相等。
具体来说,平均数、众数和中位数都是描述一组数据的集中趋势的特征数,但描述的角度和适用范围有所不同。平均数的大小与一组数据里的每个数据均有关系,其中任何数据的变动都会引起平均数的相应变动;众数着眼于对各数据出现的频数的考察,其大小只与这组数据中的部分数据有关;中位数则仅与数据的排列位置有关,某些数据的变动对中位数没有影响,当一组数据中的个别数据变动较大时,可用它来描述其集中趋势。
一般来说,平均数、中位数和钟书都是一组数据的代表,分别代表这组数据的“一般水平”、“中等水平”和“多数水平”。平均数涉及所有的数据,中位数和众数只涉及部分数据。它们互相之间可以相等也可以不相等,没有固定的大小关系。
其实,它们三者有关联也有区别。在一组数据中出现次数最多的数就是这组数据众数,众数和平均数一样,也是描述一组数据集中趋势的统计量,但它和平均数有以下两点不同:一是平均数只是一个“虚拟”的数,即一组数据的和除以该组数据的个数所得的商,而众数不是“虚拟”的数,是一组数据中出现次数最多的那个数据,是这组数据中真实存在的一个数据;二是平均数的大小与一组数据里的每个数据都有关系,任何一个数据的变动都会引起平均数大小的改变,而众数则仅与一组数据的出现的次数有关,某些数据的变动对众数没有影响,所以在一组数据中,如果个别数据变动较大,但某个数据出现的次数最多,此时用该数据(即众数)表示这组数据的“集中趋势”比较合适。
中位数和平均数一样,也是反映一组数据集中趋势的一个统计量。平均数主要反映一组数据的一般水平,中位数则更好地反映了一组数据的中等水平。它和平均数有以下不同:一是平均数只是一个“虚拟”的数,而中位数并不完全是“虚拟”数,当一组数据有奇数个时,它就是该组数据顺序排列后中间的那个数据,是这组数据中真实存在的一个数据;二是平均数的大小与一组数据里的每个数据都有关系,任何一个数据的变动都会引起平均数大小的改变,而中位数则仅与一组数据的排列位置有关,某些数据的变动对中位数没有影响,所以当一组数据的个别数据偏大或偏小时,用中位数来描述该组数据的集中趋势就比较合适。
1,输入10个数(使用for循环或do-while) 2,求出其中最大值,最小值,均值,标准差 用Java写
public class Test {
public static void main(String[] args) {
System.out.println("请输入10个double类型的数,并以空格隔开:");
Scanner input = new Scanner(System.in);
double[] arr = new double[10];
for (int i = 0; i 10; i++) {
arr[i] = input.nextDouble();
}
System.out.println(min(arr));
System.out.println(max(arr));
System.out.println("平均数:" + avg(arr));
System.out.println(standard(arr));
}
/**
* 标准差
*/
public static String standard(double[] arr) {
double sum = 0;
double avg = avg(arr);
for (int i = 0; i arr.length; i++) {
sum = sum + Math.pow((arr[i] - avg), 2);
}
return "标准差:" + Math.sqrt(sum/arr.length);
}
/**
* 平均值
*/
public static double avg(double[] arr) {
double sum = 0;
for (double a : arr) {
sum = sum + a;
}
return sum / arr.length;
}
/**
* 最大值
*/
public static String max(double[] arr) {
Arrays.sort(arr);
return "最大值:" + arr[arr.length-1];
}
/**
* 最小值
*/
public static String min(double[] arr) {
Arrays.sort(arr);
return "最小值:" + arr[0];
}
}
关于计算平均数与标准差的编程
这是你写的显示偏离平均值4个标准差以上的数值的代码:
for(i=0;iNUMELS;i++)
{
if(values[i]average+4*stddev||values[i]average-4*stddev)
printf("%f ",values[i]);
}
改为
int k=0;
double new[NUMBELS];
for(i=0;iNUMELS;i++)
{
if(values[i]average+4*stddev||values[i]average-4*stddev)
printf("%f ",values[i]);
else
new[k++]=values[i];
}
现在剔除偏离的数字,其他的数字都放入new数组中了,且现在的k值为new中的个数
只要在调用一次函数就行了
若不想浪费存储空间,则需改变values数组
int k=NUMBELS;
for(i=0;ik;i++)
{
if(values[i]average+4*stddev||values[i]average-4*stddev)
{
printf("%f ",values[i]);
values[i--]=values[k--];
}
}
跪求用Java语言实现试卷的难度与区分度 信度评估算法的源代码
简单的说,所谓调查问卷的信度是指这个问卷是不是可靠的,这个包含多层含义,比如说这份问卷是不是多次重复做结果都接近等等。
效度是指这个问卷是不是考察出了你想要考察的结果,一般这个会和一个校标做校标关联系数。
信度一般用阿尔法系数做检验
效度一般用T检验,显著性差异指数P检验。
一般应该先用小样本做信度和效度,但是做效度的样本也不应该低于60人。然后再做推广。
还有你这种量表是否应该在做效度时用校标关联系数呢,但这又需要你有新的校标。
因为不太了解具体情况,所以先这么说,在做的时候你要遇到什么问题,你在问我哈。还有建议关于怎么做信度和效度,你还是看一下相关书籍。我觉得这还是很有必要的。
一、信度系数与信度指数
大部分情况下,信度是以信度系数为指标,它是一种相关系数。常常是同一被试样本所得到的两组资料的相关,理论上说就是真分数方差与实得分数方差的比值,公式为:
r(xx)=r^2(xt)=S^2(t)/S^2(x)
公式中r^2(xt)是真分数标准差与实得分数标准差的比值,称作信度系数,公式为:
r(xt)=S(t)/S(x)
可见信度指数的平方就是信度系数。
二、测量标准误
信度系数仅表示一组测量的实得分数与真分数的符合程度,但并没有直接指出个人测验分数的变异量。我们可以用一组被试两次测量结果来代替对同一个人的反复施测,于是有了信度的另一个指标,公式为:
SE=S(x)√1-r(xx)
公式中SE为测量的标准误,S(x)是所得分数的标准差,r(xx)为测验的信度系数,从公式我们可以看出测量的标准误与信度之间有互为消长的关系:信度越高,标准误越小,信度越低,标准误越大。
p value 和t value 我在百度百科上没看到,你自己再找找吧
java标准差的代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于标准差编程、java标准差的代码的信息别忘了在本站进行查找喔。