Al作业4无监督学习

1.K均值聚类

基于样本集合划分的聚类算法,K均值聚类将样本集合划分为k个子集,构成k个类.将N个样本分到K个类,且每个样本距离其所属类中心距离最小,每个样本仅属于一个类。

2.K均值聚类是生成式还是判别式方法?

属于判别式方法

3.KNN VS. K-means

KNN:

(1) 样本的所有特征都要做可比较的量化

(2) 样本特征要做归一化处理

(3) 需要一个距离函数以计算两个样本之间的距离

(4) 确定K的值,K值选的太大易引起欠拟合,太小容易过拟合,需交叉验证确定K值。

K-means:

(1)创建K个点作为初始中心;

(2)将数据集中的每一个点分配到一个类簇中,为每个点找距其最近的中心,并将其分配给该中心所对应的类簇;

(3)更新中心,每个类簇的中心更新为该类簇所有点的平均值;

(4)当任意一个点的类簇分配结果发生改变时,对数据集中的每个数据点,对每个中心,计算中心与数据点之间的距离,将数据点分配到距离其最近的类簇,对每一个类簇,计算类簇中所有点的均值并将均值作为中心;

4.主成分分析

是一种线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的信息量最大,以此使用较少的数据维度,同时保留住较多的原数据点的特性。

5.LDAVS. PCA

LDA:

来识别大规模文档集或语料库中潜藏的主题信息。它采用了词袋的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序。

PCA:

在尽量保证“信息量不丢失”的情况下,对原始特征进行降维,也就是尽可能将原始特征往具有最大投影信息量的维度上进行投影。将原特征投影到这些维度上,使降维后信息量损失最小。

6.奇异值分解(SVD )

奇异值分解是线性代数中一种重要的矩阵分解,奇异值分解则是特征分解在任意矩阵上的推广。奇异值分解在某些方面与对称矩阵或Hermite矩阵基于特征向量的对角化类似。然而这两种矩阵分解尽管有其相关性,但还是有明显的不同。谱分析的基础是对称阵特征向量的分解,而奇异值分解则是谱分析理论在任意矩阵上的推广。

7.特征人脸方法(Eigenface )

特征脸EigenFace的思想是把人脸从像素空间变换到另一个空间,在另一个空间中做相似性的计算。EigenFace选择的空间变换方法是PCA。它广泛的被用于预处理中以消去样本特征维度之间的相关性。EigenFace方法利用PCA得到人脸分布的主要成分,具体实现是对训练集中所有人脸图像的协方差矩阵进行本征值分解,得对对应的本征向量,这些本征向量(特征向量)就是“特征脸”。每个特征向量或者特征脸相当于捕捉或者描述人脸之间的一种变化或者特性。

8.潜在语义分析(LSA)

潜在语义分析是用于知识获取和展示的计算理论和方法,它使用统计计算的方法对大量的文本集进行分析,从而提取出词与词之间潜在的语义结构,并用这种潜在的语义结构来表示词和文本,达到消除词之间的相关性和简化文本向量实现降维的目的。

9.期望最大化算法(EM )

最大期望算法,是在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐性变量。最大期望算法经过两个步骤交替进行计算,通过抽样结果反推分布参数的方法就是最大似然估计。

10.K-means是最简单的EM算法?

K-means是最简单的EM算法之一,

11.编程实现EM算法

#include<stdio.h>

#include<math.h>

double Estep1(double num1, double num2, double num3, double num4);

double Estep2(double num1, double num2, double num3, double num4);

double Mstep1(double numb1, double numb2);

int main()

{

int a[5] = { 0 };
​
int  b[5] = { 0 };
​
double ap[5] = { 0 };
​
double bp[5] = { 0 };
​
   int   i, j, n;
​
   int k = 0;
​
   double p1 = 0.6;
​
double p2 = 0.5;
​
   double s,s1=0, s2=0, s3=0, s4=0,temp,item;

   int arr[5][10] =     
​
   {
​
          {1,0,0,0,1,1,0,1,0,1},
​
          {1,1,1,1,0,1,1,1,1,1},
​
          {1,0,1,1,1,1,1,0,1,1},
​
          {1,0,1,0,0,0,1,1,0,0},
​
          {0,1,1,1,0,1,1,1,0,1}
​
   };
​
   for (i = 0; i < 5; i++)
​
   {
​
          for (j = 0; j < 10; j++)
​
          {
​
                 if (arr[i][j] == 1)
​
                        a[k] = a[k] + 1;
​
                 else
​
                        b[k] = b[k] + 1;
​
          }
​
   printf("正面次数为%d,反面次数为%d\n", a[k], b[k]);
​
                 k++;
​
   }
​
   printf("设  p1=0.6,  p2=0.5\n");

   for (n = 0; n < 10; n++)
​
   {
​
          for (k = 0; k < 5; k++)
​
          {
​
                 ap[k] = Estep1(p1, p2, a[k], b[k]);
​
                 bp[k] = Estep2(p1, p2, a[k], b[k]);
​
                 printf("%.2lf  %.2lf   \n", ap[k], bp[k]);
​
          }
​
          for (k = 0; k < 5; k++)
​
          {
​
                 temp = Mstep1(a[k], ap[k]);
​
                 s1 = s1 + temp;
​
                 item = Mstep1(b[k], ap[k]);
​
                 s2 = s2 + item;
​
          }
​
          for (k = 0; k < 5; k++)
​
          {
​
                 temp = Mstep1( bp[k],a[k]);
​
                 s3 = s3 + temp;
​
                 item = Mstep1( bp[k],b[k]);
​
                 s4 = s4 + item;
​
          }
​
          p1 = s1 / (s1 + s2);
​
          p2 = s3 / (s3 + s4);
​
          printf("A的概率为:%.2lf,B的概率为:%.2lf\n", p1, p2);
​
   }
​
   printf("最终结果为%.2lf和%.2lf\n", p1,p2);
​
   for (k = 0; k < 5;k++)
​
   {
​
          s = a[k]*1.0 / 10;
​
          printf("s=%.2lf\n", s);
​
          if (fabs(s - p1) < fabs(s - p2))
​
          {
​
                 printf("第%d组为硬币A\n", k+1);
​
          }
​
          else
​
          {
​
        printf("第%d组为硬币B\n",k+1);
​
          }
​
   }

}

double Estep1(double num1, double num2, double num3, double num4)

{/*p1=1 p2=2 n1=3 n1f=4 */

   double a1, b1, ap1, bp1;
​
   a1 = pow(num1, num3) * pow((1.0 - num1), num4);
​
   b1 = pow(num2, num3) * pow((1.0 - num2), num4);
​
   ap1 = a1 / (a1 + b1);
​
   bp1 = 1.0 - ap1;
​
   return ap1;

}

double Estep2(double num1, double num2, double num3, double num4)

{

   double a1, b1, ap1, bp1;
​
   a1 = pow(num1, num3) * pow((1.0 - num1), num4);
​
   b1 = pow(num2, num3) * pow((1.0 - num2), num4);
​
   ap1 = a1 / (a1 + b1);
​
   bp1 = 1.0 - ap1;
​
   return bp1;

}

double Mstep1(double numb1,double numb2)

{

   double s1;
​
   s1 = numb1 * numb2;
​
   return s1;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值