当前位置:   article > 正文

PyTorch][chapter 12][李宏毅深度学习][Semi-supervised Linear Methods-1]

PyTorch][chapter 12][李宏毅深度学习][Semi-supervised Linear Methods-1]

 这里面介绍半监督学习里面一些常用的方案:

K-means ,HAC, PCA 等


目录:

  1.    K-means
  2.    HAC
  3.    PCA

一  K-means

    【预置条件】

          X=\begin{Bmatrix} x^1 &x^2 &... & x^N \end{Bmatrix}

         N 个样本分成k 个 簇

         step1:

                初始化簇中心点 c_i,i=1,2,..k(随机从X中抽取k个样本点作为)

         Repeat: 

                For  all x^n in X: 根据其到  C_i(i=1,2,..k)的欧式距离:

                 b_i^n=\left\{\begin{matrix}1:\, x^n\, most\, close \, c_i\\ 0: else \end{matrix}\right.(代表第n个样本属于第i簇)

                updating all c_i:

                 c_i=\frac{\sum_{x^n}b_i^nx^n}{\sum_{x^n}b_i^n}

          问题:

                 不同的初始化参数影响很大.可以通过已打标签的数据集作为c_i,

            未打标签的


二 Hierachical agglomerative Clustering(HAC)层次凝聚聚类算法

     流程

       1: build a tree (创建数结构)

       2  clustering by threshold (通过不同的阀值进行聚类)

     

   例   假设有5笔data:    x^1,x^2,x^3,x^4,x^5

       build a tree

       1  合并其中距离最近的两项  x^1,x^2

              

         2 基于合并后的数据集 (x^1,x^2,x^3,x^4),合并其中距离最小的两项  x^2,x^3

            

       1.3  基于 x^1,x^2,x^3 合并其中最小的两项 x^1,x^3

1.4 最后只剩下最后两项(N<=k),合并作为root

2  聚类(pick a threshold 选择不同的阀值进行分类)

  比如阀值在黑色虚线的位置:

x^1,x^2 为1类

x^3 为一类

 x^4,x^5为一类

  

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Fri Jan 26 15:55:03 2024
  4. @author: chengxf2
  5. """
  6. import numpy as np
  7. import math
  8. def euler_distance(point1, point2):
  9. #计算欧几里德距离
  10. distance = 0.0
  11. c= point1-point2
  12. distance = np.sum(np.power(c,2))
  13. return math.sqrt(distance)
  14. class tree:
  15. #定义一个节点
  16. def __init__(self, data, left= None, right = None, distance=-1,idx= None, count=1):
  17. self.x = data
  18. self.left = left
  19. self.right = right
  20. self.distance = distance
  21. self.id = idx
  22. self.count = count
  23. def mergePoint(a,b):
  24. c= np.vstack((a,b))
  25. return c
  26. class Hierarchical:
  27. def __init__(self, k=1):
  28. assert k>0
  29. self.k =k
  30. self.labels = None
  31. def getNearest(self, nodeList):
  32. #获取最邻近点
  33. N = len(nodeList)
  34. #print("\n N",N)
  35. min_dist = np.inf
  36. for i in range(N-1):
  37. for j in range(i+1, N):
  38. #print("\n i ",i,j)
  39. pointI = nodeList[i].x
  40. pointJ = nodeList[j].x
  41. d = euler_distance(pointI, pointJ)
  42. if d <min_dist:
  43. min_dist = d
  44. closerst_point = (i, j)
  45. return closerst_point,min_dist
  46. def fit(self, data):
  47. N = len(data)
  48. nodeList = [ tree(data=x,idx = i) for i,x in enumerate(data)]
  49. currentclustid = -1
  50. self.labels =[-1]*N
  51. print(self.labels)
  52. while(len(nodeList)>self.k):
  53. closerest_point,min_dist = self.getNearest(nodeList)
  54. #print("\n closerest_point",closerest_point)
  55. id1, id2 = closerest_point
  56. node1, node2 = nodeList[id1], nodeList[id2]
  57. merge_vec =np.vstack((node1.x,node2.x))
  58. avg_vec = np.mean(merge_vec,axis=0)
  59. #print(node1.x, node2.x, avg_vec)
  60. new_node = tree(data=avg_vec, left=node1, right=node2, distance=min_dist, idx=currentclustid,
  61. count=node1.count + node2.count)
  62. currentclustid -= 1
  63. del nodeList[id2], nodeList[id1]
  64. nodeList.append(new_node)
  65. self.nodes = nodeList
  66. def calc_label(self):
  67. for i, node in enumerate(self.nodes):
  68. print("\b label",i)
  69. self.leaf_traversal(node, i)
  70. def leaf_traversal(self, node: tree, label):
  71. if node.left is None and node.right is None:
  72. self.labels[node.id] = label
  73. if node.left:
  74. self.leaf_traversal(node.left, label)
  75. if node.right:
  76. self.leaf_traversal(node.right, label)
  77. if __name__ == "__main__":
  78. data = np.array([[1,1],
  79. [1,1],
  80. [2,2],
  81. [3,3],
  82. [3,4]] )
  83. net = Hierarchical(k=2)
  84. net.fit(data)
  85. net.calc_label()

三  PCA(Principle Component Analysis)

     PCA 是机器学习里面一种主要降维方案,深度学习里面常用的是AE编码器.

  如下图在3维空间里面,不同数据分布在不同的空间,通过PCA 降维到2D 

空间后,不同类别的数据分布依然分布在不同的空间,数据处理起来更方便.

原理推导:

    

已知:

     x \in R^{n,1} 为列向量

     数据集中有m笔该数据集

     W=[w_1,w_2,..w_k]w_1 \in R^{n,1} 列向量

      在第一个维度上面的投影为:

        z_1=w_1^Tx

       我们期望最大方差

        var(z_1)=\sum_{z_1} (z_1-\bar{z_1})^2 

        解:

            var(z_1)=\sum_x (w_1^Tx-w_1^T\bar{x})^2(利用(a^Tb)^2=a^Tbb^Ta)

                           =\sum_{x} w_1^T(x-\bar{x})(x-\bar{x}) w_1

                            =w_1^T(\sum_x(x-\bar{x})(x-\bar{x})^T)w_1

                             =w_1^TSw_1

           加上约束条件w_1^Tw_1=1,利用拉格朗日对偶算法求解

        L=-w_1^TSw_1+\alpha(w_1^Tw_1-1)(S是协方差矩阵,对称矩阵)

      对w_1求微分

   -Sw_1+\alpha w_1=0

   Sw_1=\alpha w_1

           w 就是特征向量

            \alpha  特征值

实对称矩阵S的重要性质,特征值一般只取前k个大于0的(负的只是方向问题)

                              

40:00

参考:

CV算法:K-means 、HAC、Mean Shift Clustering - 简书

13: Unsupervised Learning - Linear Methods_哔哩哔哩_bilibili

https://www.johngo689.com/549602/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/51725
推荐阅读
相关标签
  

闽ICP备14008679号