算法小白的第一次尝试----出行模式分析(矩阵聚类,数据实战)

干货 | Python爬虫实战:两点间的真实行车时间与路况分析(上) 本文来源于公众号【程序猿声】,作者向柯玮 前言 大家好,我又又来来来来了!在这里先祝大家身体健康,天天开心! 虽然放假,在家里小玮同学也没有休息,这一次给大家带来的是利用爬虫爬取地图软件的相关数据,并制作成图表进行分析。 为什么突然想做一期关于爬虫的内容呢?其实是因为前段时间收到老师的任务,研究一下现实中两点之间的旅行时间是否受出发时间的影响。 这个题目可把当时的小玮吓坏了–python我都... 阅读详情

主要功能: 根据交通出行数据,通过刷卡记录,获取用户的所有出行od,以天为单位构建矩阵,对矩阵进行聚类

主要采用了kmeans进行聚类,轮盘法(kmeans++思想)进行簇初始化,采用SSE(拐点)进行聚类效果评价

kmeans++ 与kmeans参考该篇博客:

https://www.cnblogs.com/wang2825/articles/8696830.html

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述SSE选择最佳K:
在这里插入图片描述

import breeze.linalg.{Axis, DenseMatrix, sum}
import breeze.numerics._
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.SparkSession

import scala.collection.mutable.{ArrayBuffer, ListBuffer}

/**
  * Created by GangTian on 2020/4/30 in SIBAT
  */
object Kmeans {
  val time_coefficient = 0.5 //时间系数(向量距离计算)
  val geo_coefficient = 0.5 // 地理位置系数(向量距离计算)
  val k_factor = 0.5 //最大聚类系数,最大簇数 = k_factor * daysOfTrip(出行总天数)
  val iterator = 10 //k-means迭代次数
  val mse = 0.01 //簇中心变化幅度

  def main(args: Array[String]): Unit = {
    Logger.getLogger("org").setLevel(Level.ERROR)
    val spark = SparkSession.builder().master("local[*]").getOrCreate()
    val sql = spark.sqlContext
    val sc = spark.sparkContext
    import spark.implicits._

    // 1.数据集准备-----造了一份数据,特征未经过标准化处理,实数据处理过
    val list = new ListBuffer[(String, String, String, Double, Double, String, Double, Double, Double, Double)]()
    list.append(("001", "2020-05-01", "A", 1, 1, "B", 1.1, 1.1, 7.5, 8.0))
    list.append(("001", "2020-05-01", "B", 1.1, 1.1, "A", 1, 1, 18.5, 19.0))
    list.append(("001", "2020-05-02", "C", 7, 7, "D", 8, 8, 9.5, 10.5))
    list.append(("001", "2020-05-02", "D", 8, 8, "C", 7, 7, 20.5, 21.5))
    list.append(("001", "2020-05-03", "A", 1, 1, "B", 1.1, 1.1, 7.6, 8.1))
    list.append(("001", "2020-05-03", "A", 1, 1, "B", 1.1, 1.1, 7.6, 8.1)) 
    list.append(("001", "2020-05-03", "A", 1, 1, "B", 1.1, 1.1, 7.6, 8.1)) 
    list.append(("001", "2020-05-03", "A", 1, 1, "B", 1.1, 1.1, 7.6, 8.1)) 
    list.append(("001", "2020-05-03", "B", 1.1, 1.1, "A", 1, 1, 18.4, 19.2))
    list.append(("001", "2020-05-04", "C", 7, 7, "D", 8, 8, 9.6, 10.4))
    list.append(("001", "2020-05-04", "D", 8, 8, "C", 7, 7, 20.7, 21.6))
    list.append(("001", "2020-05-05", "A", 1, 1, "B", 1.1, 1.1, 7.7, 8.3))
    list.append(("001", "2020-05-05", "B", 1.1, 1.1, "A", 1, 1, 18.3, 19.0))
    list.append(("001", "2020-05-06", "C", 7, 7, "D", 8, 8, 9.2, 10.2))
    list.append(("001", "2020-05-06", "C", 7, 7, "D", 8, 8, 9.2, 10.2)) 
    list.append(("001", "2020-05-06", "D", 8, 8, "C", 7, 7, 20.2, 21.3))
    list.append(("001", "2020-05-07", "E", 5, 5, "F", 15, 15, 6.1, 8.1))
    list.append(("001", "2020-05-07", "F", 15, 15, "G", 20, 20, 16.1, 18.1))
    list.append(("001", "2020-05-07", "G", 20, 20, "E", 5, 5, 20.1, 22.1))
    list.append(("001", "2020-05-08", "A", 1, 1, "D", 8, 8, 0.5, 10.5))
    list.append(("001", "2020-05-08", "D", 8, 8, "F", 15, 15, 10.5, 14.5))
    list.append(("001", "2020-05-08", "F", 15, 15, "A", 1, 1, 17.5, 21.5))
    list.append(("001", "2020-05-08", "F", 15, 15, "A", 1, 1, 17.5, 21.5)) 
    list.append(("001", "2020-05-08", "F", 15, 15, "A", 1, 1, 17.5, 21.5)) 
    list.append(("001", "2020-05-09", "E", 5, 5, "F", 15, 15, 6.3, 8.4))
    list.append(("001", "2020-05-09", "F", 15, 15, "G", 20, 20, 16.4, 18.2))
    list.append(("001", "2020-05-09", "G", 20, 20, "E", 5, 5, 20.2, 21.9))

    sc.parallelize(list).toDF("card_id", "date", "departLocation", "departLon", "departLat", "arrivalLocation", "arrivalLon", "arrivalLat", "departTime", "arrivalTime")
      .sort("date").show(100)
    
    val kmax = 8 //最大天数
    val res = new ListBuffer[((Int,Double, ListBuffer[(DenseMatrix[Double], DenseMatrix[Double])]))]()
    for(i<-1 to(kmax)){
      res.append(run(list,i))
    }
    val best_k = calPointToLineDis(res.map(tp =>(tp._1,tp._2)))
    println("best_k: " + best_k)

    // 数据还原回去
    val dateArr = new ArrayBuffer[(String,Int)]()
    var label = 1
    val b2 = res.filter(_._1 == best_k).head._3.groupBy(_._2)
      .foreach(tp =>{
        val  k = tp._2
        for(r <- k){
          val date_pre = r._1(0,0).toLong.toString
          val date = date_pre.substring(0,4) + "-" + date_pre.substring(4,6) + "-"+ date_pre.substring(6)
          dateArr.append((date,label))
        }
        label += 1
      })
    dateArr.foreach(println(_))
  }

  /**
    * calculate the distance of one point to the line
    * @return
    */
  def calPointToLineDis(points:ListBuffer[(Int,Double)]):Double={
    val points_new = points.sortBy(_._1)
    val startPoint = points_new.head
    val endPoint = points_new.last
    //求取直线系数,k和b
    val k = (startPoint._2 - endPoint._2) / (startPoint._1 - endPoint._1)
    val b = startPoint._2 - k * startPoint._1
    // 求取拐点,拐点离直线距离最远
    val disArr = new ArrayBuffer[(Int,Double)]()
    for(point <- points_new){
      val dis = math.abs(k * point._1 + b - point._2)
      disArr.append((point._1,dis))
    }
    val best_k = disArr.sortBy(_._2).last._1
    best_k
  }


  /**
    * the entry of kmeans program, the method return the SSE and matrix and cluster within the k clusters,the matrix and cluster are in the shape of tuple
    * @param list
    * @param k
    * @return
    */
  def run(list: ListBuffer[(String, String, String, Double, Double, String, Double, Double, Double, Double)],k:Int):(Int,Double, ListBuffer[(DenseMatrix[Double], DenseMatrix[Double])]) = {
    //1.日期数据转化成matrix
    val matrix_list = list2Matrix(list)

    //2.基于kmeans++ 思想初始化聚类中心
    val initial_clusters = initialize_cluster(matrix_list, k)

    //3.声明可变的cluster
    var variable_clusters = new ListBuffer[DenseMatrix[Double]]()
    for (initial_cluster <- initial_clusters) variable_clusters.append(initial_cluster)

    //3.计算每个样本xi到K个聚类中心的距离,并将其划分到距离最小的聚类中心对应的类中(matrix,cluster)
    var clusterResult = new ListBuffer[(DenseMatrix[Double],DenseMatrix[Double])]()
    var flag = true
    for (i <- 0 until (iterator) if flag) {
      val res = new ListBuffer[(DenseMatrix[Double], DenseMatrix[Double])] //res存放matrix 和其对应的center
      for (matrix <- matrix_list) {
        val center = calDisOfMatrix2(matrix, variable_clusters)
        res.append((matrix, center))
      }
      clusterResult = res

      //根据聚类后的结果,更新center矩阵
      val newCenter = reflash_center(res)

      // 判断center是否发生变化,若center不变,则不再迭代
      var flag2 = true
      for(ct <- newCenter if flag2){
        if(!variable_clusters.contains(ct)){
          flag2 = false
          variable_clusters = newCenter
        }
      }
      if(flag2) flag = false
    }

    //4. 计算当前 k对应的SSE指标
    val sse = estimate(clusterResult)
    (k,sse,clusterResult)
  }


  /**
    * calculate the SSE(sum of the squared error)
    * @param clusterResult
    * @return
    */
  def estimate(clusterResult: ListBuffer[(DenseMatrix[Double], DenseMatrix[Double])]):Double = {
    var sse = 0.0
    for(tp<- clusterResult){
      sse += calDisOfMatrix(tp._1,Array(tp._2))
    }
    sse
  }


  /** reflash the center
    *
    * @param res res store the matrix and it corresponding center in tuple form
    */
  def reflash_center(res: ListBuffer[(DenseMatrix[Double], DenseMatrix[Double])]): ListBuffer[DenseMatrix[Double]] = {
    val c1 = res.head._2
    val rows = c1.rows // center对应的行数
    val cols = c1.cols // center对应的列数
    val result = new ListBuffer[DenseMatrix[Double]]()
    val groups = res.groupBy(_._2)
    for (group <- groups) {
      val value = group._2.map(_._1)
      val len = value.length * 1.0
      var center: DenseMatrix[Double] = DenseMatrix.zeros[Double](rows, cols)
      for (va <- value) {
        center += va
      }
      val center2: DenseMatrix[Double] = center / len
      result.append(center2)
    }
    result
  }


  /**
    * based on the kmeans++ algorithm to select the k clusters
    *
    * @param list input data with shape of denseMatrix
    * @param k    represent the initialize numbers of clusters
    * @return
    */
  def initialize_cluster(list: ListBuffer[DenseMatrix[Double]], k: Int): Array[DenseMatrix[Double]] = {
    var remain_k = k
    val seed = (math.random * list.length).toInt
    val clusters = new ArrayBuffer[DenseMatrix[Double]]()
    //c1簇
    clusters.append(list(seed))
    remain_k -= 1

    //其它簇采用轮盘法选取
    for (i <- 0 until (remain_k)) {
      // 1. 计算剩余样本与当前所有簇中心的最短距离
      val disArr = new ArrayBuffer[(DenseMatrix[Double], Double)]()
      for (matrix <- list if !clusters.contains(matrix)) {
        val dis = calDisOfMatrix(matrix, clusters.toArray)
        disArr.append((matrix, dis))
      }

      //2.计算概率px
      val total = disArr.map(_._2).sum
      val px = disArr.map(x => x._2 / total)

      //3.根据概率计算区间
      val sum_px = new ArrayBuffer[Double]()
      var sum_all = 0.0
      for (p <- px) {
        sum_all += p
        sum_px.append(sum_all)
      }

      //4.随机选择新的簇
      val rand = math.random
      var flag = true
      if (rand < sum_px(0)) {
        clusters.append(disArr.head._1)
        flag = false
      } else if (rand > sum_px(sum_px.length - 2)) {
        clusters.append(disArr.last._1)
      } else {
        for (i <- 0 until (sum_px.length - 1) if flag) {
          if (rand > sum_px(i) && rand < sum_px(i + 1)) {
            clusters.append(disArr(i + 1)._1)
            flag = false
          }
        }
      }
      // 5.选除新的簇后,remain_k自减1
      remain_k -= 1
    }
    clusters.toArray
  }


  /**
    * calculate the number of departure and destination pairs,and expandding the one day data to a matrix,
    * so every day has the same matrix shape including rows and cols
    *
    * @param list
    * @return
    */
  def list2Matrix(list: ListBuffer[(String, String, String, Double, Double, String, Double, Double, Double, Double)]): ListBuffer[DenseMatrix[Double]] = {
    // 1.从历史记录中筛选所有od 对
    val ods = list.map(tp => (tp._3 + tp._6)).distinct.sorted

    // 2.统计每一组od对在所有天数中出现次数的最高频次
    val groups = list.groupBy(_._2).toArray
    val odNum = new ArrayBuffer[(String, Int)]()
    for (od <- ods) {
      var max = 0
      for (group <- groups) {
        val num = group._2.filter(tp => (tp._3 + tp._6) == od).length
        if (num > max) max = num
      }
      odNum.append((od, max))
    }

    // 3.根据odNum将list记录填充至二维矩阵
    val matrix_list = new ListBuffer[DenseMatrix[Double]]()
    val rows = odNum.map(_._2).sum //矩阵行数
    val cols = 7 //矩阵列数

    //4.group代表每一天的记录
    for (group <- groups) {
      val date = group._1.replace("-", "").toDouble
      val odArr = new ListBuffer[(Double, Double, Double, Double, Double, Double, Double)]()
      val record = group._2.sortBy(_._9) //按出发时间排序
      for (od <- odNum) {
        val res = record.filter(tp => (tp._3 + tp._6) == od._1)
        try {
          res.foreach(tp => odArr.append((date, tp._4, tp._5, tp._7, tp._8, tp._9, tp._10)))
        } catch {
          case e: Exception => println()
        }

        // 扩充至od._2
        val delta = od._2 - res.length
        for (i <- 0 until (delta)) {
          odArr.append((date, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0))
        }
      }

      //5. 将扩充后的数组转为矩阵形式
      val vec = odArr.map(tp => (tp._1 + "," + tp._2 + "," + tp._3 + "," + tp._4 + "," + tp._5 + "," + tp._6 + "," + tp._7))
        .flatMap(str => str.split(","))
        .map(_.toDouble)
      val matrix = new DenseMatrix[Double](cols, rows, vec.toArray).t
      matrix_list.append(matrix)
    }
    matrix_list
  }


  /**
    * calculate the distance between the input matrix of the clusters,and return the least distance
    *
    * @param matrix
    * @param clusters
    */
  def calDisOfMatrix(matrix: DenseMatrix[Double], clusters: Array[DenseMatrix[Double]]): Double = {
    var dis = Double.MaxValue //初始化最大value
    for (cluster <- clusters) {
      val m = matrix - cluster
      val dis_1 = sum(sqrt(sum(pow(m(::, 1 to (2)), 2.0), Axis._1)))
      val dis_2 = sum(sqrt(sum(pow(m(::, 3 to (4)), 2.0), Axis._1)))
      val dis_3 = sum(sum(abs(m(::, 5 to (6))), Axis._1))
      val distance = geo_coefficient * (dis_1 + dis_2) + time_coefficient * dis_3
      if (distance < dis) dis = distance
    }
    math.pow(dis, 2.0)
  }

  /**
    * calculate the least distance between the matrix and the clusters,and return the cluster center which the matrix belongs
    *
    * @param matrix
    * @param clusters
    */
  def calDisOfMatrix2(matrix: DenseMatrix[Double], clusters: ListBuffer[DenseMatrix[Double]]): DenseMatrix[Double] = {
    var dis = Double.MaxValue //初始化最大value
    var center: DenseMatrix[Double] = null
    for (cluster <- clusters) {
      val m = matrix - cluster
      val dis_1 = sum(sqrt(sum(pow(m(::, 1 to (2)), 2.0), Axis._1)))
      val dis_2 = sum(sqrt(sum(pow(m(::, 3 to (4)), 2.0), Axis._1)))
      val dis_3 = sum(sum(abs(m(::, 5 to (6))), Axis._1))
      val distance = geo_coefficient * (dis_1 + dis_2) + time_coefficient * dis_3
      if (distance < dis) {
        dis = distance
        center = cluster
      }
    }
    center
  }
}

数据(真实,非上述)实战结果:

在这里插入图片描述

【机器学习】聚类算法、社区发现 目录 前言 前言 最近方向是团案挖掘,关于聚类算法,其实之前不怎么了解,最近得补补了。 聚类和社区发现 首先要先明白这两者的差别。 [参考地址] 社团检测通常是指将网络中联系紧密的部分找出来,这些部分就称之为社团,那么也可以认为社团内部联系稠密,而社团之间联系稀疏 [1]。显而易见,其中有一个非常重要的点,稠密是如何定义的。不管现在想到的定义是什么,但都包含顶点,边,度,或许还有路径这些字眼,它们有一个共同的特征–网络的结构。所以,社团检测侧重于找到网络中联系紧密的部分,而经常忽略节点的. 阅读详情

相关推荐

文本聚类教程

本人曾做机器学习方向,由于实习需要转做文本聚类、分类的工作,虽然大致相似,但仍是新手,过程和结果也仅供大神指教。本博包含了作者两周的专心研究调试及由数千行测试得到了300余行代码精华,如需转载,请注明出处。 什么是文本聚类? 文本聚类是将一个个文档由原有的自然语言文字信息转化成数学信息,以高维空间点的形式展现出来,通过计算那些点距离比较近来将那些点聚成一个簇,簇的中心叫做簇心。一个

chixujohnny 1万+

使用k-means聚类算法对矩阵元素进行分类

4.2 使用k-means聚类算法对矩阵元素进行分类 实验目的 了解k-means聚类算法的原理 了解k-means聚类算法中各参数的含义以及对聚类结果的影响 熟练安装python扩展库sklearn。 了解使用sklearn 库中k-means聚类算法解决问题的基本思路。 实验内容 编写程序,使用k-means聚类方法对已知数据进行聚类,然后对未知样本进行分类。数据自己进行模拟生成,要求为整数,样本个数至少为 100个,类别作为输入参数。 k-means 算法的基本思想:以空间k个点为中心进行

SKPrimin的博客 4224

KMeans、PAM、CLARA、CLARANS聚类算法和代码

聚类算法的最终目的是: result = MAX{集合内的相似度}/{集合间的相似度} 需要帮忙写任何算法、课程设计、论文算法实现、都可以找我企鹅:1028434547 1、K均值聚类算法,也叫KMeans聚类算法。 该算法的基本思想是和我们人进行物品分类的思想是相同的,就是通过距离来进行衡量。那么我们首先就需要知道我们要分成几个类,然后就找到几个类的相应的中心点,然后就把其...

c_living的博客 1万+

四种聚类方法浅谈

聚类作为一种重要的人类行为,早在还提时代,一个人就通过不断的改进下意识中的聚类模式类学会如何区分家猫、家狗等等动植物。目前,聚类方法也在许多领域都得到了广泛的研究和成功应用。常见的如:模式识别、数据分析、图像处理、市场研究以及文档分析等。 聚类原理:聚类就是按照某个特定的标准(最常见的如距离)把一个数据集分割成不同的类或者簇,从而使得同一个簇类的数据对象的相似性尽可能的最大,...

不爱成长的笨蛋 2262

数据挖掘聚类算法

数据挖掘聚类算法

bgfuufb的博客 1811

使用sklearn对iris数据集进行聚类分析

导入库 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import load_iris from sklearn.cluster import KMeans from sklearn.preprocessing import MinMaxScaler %matplotlib inline sns.set(style="w

志浩同学的博客 7585

聚类算法 距离矩阵_一文彻底搞定谱聚类

Clustering 聚类谱聚类上文我们引入了是聚类,并介绍了第一种聚类算法K-means。今天,我们来介绍一种流行的聚类算法——谱聚类(Spectral Clustering),它的实现简单,而且效果往往好于传统的聚类算法,如k-means,但是其背后的原理涉及了很多重要而复杂的知识,如图论,矩阵分析等。别担心,今天小编就带你一举攻克这些难关,拿下谱聚类算法。Q:什么是谱聚类?A: 谱聚类是最流...

weixin_39555715的博客 1121

复杂网络中聚类算法总结

网络,数学上称为图,最早研究始于1736年欧拉的哥尼斯堡七桥问题,但是之后关于图的研究发展缓慢,直到1936年,才有了第一本关于图论研究的著作。20世纪60年代,两位匈牙利数学家Erdos和Renyi建立了随机图理论,被公认为是在数学上开创了复杂网络理论的系统性研究。之后的40年里,人们一直讲随机图理论作为复杂网络研究的基本理论。然而,绝大多数的实际网络并不是完全随机的。1998年,Watt...

Jiameier的专栏 9166

聚类--相似性度量矩阵

对于Pearson相关系数,可以先将数据集中的每个数据点表示为一个向量,然后计算每对向量之间的Pearson相关系数,得到一个相关系数矩阵。对于余弦相似度,可以先将数据集中的每个数据点表示为一个向量,然后计算每对向量之间的余弦相似度,得到一个相似度矩阵。以上是常见的几种构造相似性度量矩阵的方法。需要注意的是,在进行聚类分析时,选择合适的相似性度量方法和相应的相似性度量矩阵非常重要,它们将直接影响聚类结果的准确性和可靠性。聚类的相似性度量矩阵是一个对称矩阵,它的每个元素表示两个数据点之间的相似性度量。

weixin_63288684的博客 1744

聚类算法 距离矩阵_层次聚类的初学者指南

介绍任何行业中,了解客户行为都是至关重要的。去年,我的首席营销官问 “现有客户中哪些客户应作为新产品的目标用户?”时,我就意识到了这一点。对我来说,这是一个很好的学习曲线。我意识到了细分客户是多么重要,这样企业就可以制定和构建针对性策略。聚类的概念在这里变得非常方便!像细分客户这样的问题通常很棘手,因为我们没有任何目标变量供考虑。我们处在一个无监督学习的状态,需要从中找出模式和结构,而不用考虑一个...

weixin_39808877的博客 3889

采用K-means聚类,实现多维矩阵的聚类,并进行可视化展示(matlab)

我的数据是115*64维的,需要进行聚类操作,于是自己动手进行了实验,运用的是matlab语言,最后选取部分进行可视化展示,效果还不错。(代码注释完整)

聚类算法 距离矩阵_聚类算法

聚类是根据样本特征的相似度或者距离对样本进行归类。因此距离和相似度的选择对聚类效果有决定性作用。一、距离Minkowski(L_p距离)2. 马氏距离 是所有样本的协方差矩阵3. 相关系数 4. 余弦夹角 二、类的特征类均值,类中所有样本均值类直径,类中距离最大的两个样本间的距离类样本散布矩阵 类样本协方差阵 是特征维度三、类与类之间距离单连接,类样本最小距离完全连接,类样本...

weixin_39569894的博客 3004

十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序

冒泡排序、选择排序、插入排序、快速排序、希尔排序

HK的博客 18万+

聚类分析——基于Kaggle数据集实战

聚类算法在实际中的应用主要侧重在以下几个方面:一、目标划分、特征画像,将目标数据按照特征的相似性,将目标划分为不同的类别,然后再对不同的类别进行特征描述,最后做出与研究目标相关的建议,这一块的话在论文和竞赛中使用比较常见,尤其是竞赛中做客户的特征画像,分析不同群体特征,从而给出针对性的建议;本次使用的聚类算法是kmeans++算法和层次聚类两种聚类算法进行演示,其中K-means++是对传统Kmenas算法的改进,旨在改善初始质心的选择,以提高算法的性能和结果的稳定性。

weixin_50249953的博客 4570

基于YOLO+DeepSeek的农作物病虫害检测系统

本系统是一个基于YOLO+DeepSeek的农作物病虫害检测系统。 可使用YOLOV1-YOLOV12的任意模型进行目标检测。可以实现检测图片、批量检测图片、视频检测、摄像头检测四种方式。

qq_51977316的博客 1810

OpenStack 之 Epoxy版本 部署实战

OpenStack Epoxy 是 OpenStack 的第 31 个版本,其版本号为 2025.1,于 2025 年 4 月 2 日正式发布。

求知若渴,虚心若愚。 236

聚类算法总结

参考论文:数据挖掘中的聚类算法研究 焦守荣               一般把学习算法分成有监督和无监督学习两种方式。主要区别是有没有类信息作为指导。聚类分析是典型的无监督学习算法,一般用于自动分类。          聚类分析是按照某个特定标准(通常是某种距离)把一个数据集分割成不同的类(Class),使得类内相似性尽可能的大,同时使得不同的类之间区别性也尽可能的大。直观的说,最终形成的每

yangany1_sjtu的专栏 5149

15、分布式参数热交换器:建模、动态特性与控制

本文综述了分布式参数热交换器的建模、动态特性和控制方法。从热交换器的基本方程推导出发,探讨了一维流动、流动强迫、错流、螺旋和旋转再生式热交换器的建模方法,并分析了其动态行为和频率响应中的共振现象。同时,介绍了热交换器的模拟方法,包括数值模拟和近似方法,并讨论了多种控制策略,如常规控制、最优控制、数字控制以及自适应控制。最后,总结了热交换器研究的发展历程,并展望了未来的研究方向,包括建模精度提升、控制算法优化和跨学科融合等。

w8x9y0z1的博客 123

数据挖掘——PAM(K-Medoids)聚类算法学习

文章目录一、前言二、算法描述三、实例描述算法四、python代码五、总结参考资料 一、前言   k-means算法对离群点敏感,因为这种对象远离大多数数据,隐藏分配到一个簇时,它们可能严重地扭曲簇的均值。这不经意间影响了其他对象到簇的分配。   于是一种基于K-means的改进算法k-mediod应运而生。围绕中心点划分(Partitioning Around Medoids, PAM)算法是k-...

潘多拉星系的专栏 3万+

获取抖音中x-secsdk-csrf-token的方法

获取抖音中x-secsdk-csrf-token的方法

sh_moranliunian的博客 2022

YOLOv11 改进 - 注意力机制 | GC Block(GlobalContext Block)全局上下文块:三重变换捕获全局依赖,提升复杂场景鲁棒性

本文介绍了全局上下文块(GC Block)及其在YOLOv11中的集成应用。GC Block是GCNet的核心组件,结合了NLNet和SENet的优势,通过上下文建模、特征变换和特征融合三个模块,高效捕获特征图中的全局依赖关系,在提高模型性能的同时降低计算成本。我们将GC Block引入YOLOv11,在检测头部分的不同尺度特征图上应用该模块。实验表明,改进后的YOLOv11在目标检测任务中表现良好,展现了GC Block在实际应用中的价值。

魔改工程师的博客 953

SKlearn——聚类算法

SKlearn——K均值聚类

m0_37634594的博客 5019

手把手教您国内安装 Claude Code 并配置自定义大模型(包含New-API中转和可视化管理工具的使用)

国内免魔法畅用 Claude Code!手把手教你 Windows 安装、配置文件写法、对接阿里百炼 / DeepSeek / 智谱✨,附完整参数、正确命令、三方工具管理方案,新手一次成功!✅

XiaoqiangClub的博客 3786

聚类算法及可视化方法的实践与探索

簇内平方和表示数据点到其簇内质心的距离的平方和,公式如下:其中, 是k簇数, ni是第 i 个簇的样本数, xij是第 i个簇中的第 j 个样本。在图像中,我们寻找一个肘部,即簇内平方和的变化趋势减缓的点。这个肘部对应的簇数就是我们的最佳选择。需要注意,有时候肘部并不明显,这时可能需要结合业务背景和其他评估指标来综合判断最佳的簇数。

2301_80100415的博客 2834

124、LLC谐振变换器的矩阵变压器设计

摘要 本文分享了LLC谐振变换器中矩阵变压器的实战设计经验。针对大功率LLC单颗变压器的痛点(绕组层数多、散热不均、漏感一致性差),作者提出将大变压器拆分为多个小变压器单元(建议6个),通过原边串联、副边并联的方式实现功率分配。详细解析了磁芯选型、匝比计算、绕组结构、漏感控制和散热设计等关键参数,特别强调了小磁芯优势、等效匝比计算误区以及三明治绕法的重要性。文中还总结了调试过程中的谐振频率偏移和均流问题解决方案,并给出了矩阵数量选择、磁芯材质、绝缘材料等实用建议。作者指出,矩阵变压器在2kW以上LLC应用中

Jack010169的博客 173

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: 算法小白的第一次尝试----tensorflow2.0 CNN参数计算(图文解析CNN)
下一篇: 记一次spark 写入pgsql异常及解决
小糖宝
博客等级 码龄9年 47粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值