求助KMeans算法关于转换矩阵Vectors问题

遇到的问题,KMeans算法中,通过map算子,两种处理方法,结果不一样,第一种莫名的增加了很多列?

1.数据内容如下 test1.csv 


2.完整代码如下

val rawData = sc.textFile("E:\\test1.csv")
    println("----11122221-----")
    rawData.foreach(println )
    val labelsAndData = rawData.map{ line =>

      val label = line.split(',').toString
      println("lable:...."+label)
      val vector = Vectors.dense(label.map(_.toDouble).toArray)
      println("vector11111:......"+vector)
      (label,vector)
      /**
        * 或者这样写
        */
      val label2 = line.split(',')
      val aa2 = label2.map(_.toDouble)
      val vector2 = Vectors.dense(label2.map(_.toDouble))
      println("vector22222:...."+vector2)
      (label2,vector2)
    }


    labelsAndData.foreach(println )
    val data = labelsAndData.values
    println("---------******---------")
    println("data:"+data)
    data.foreach(println )

    val dataAsArray = data.map(_.toArray)
    println("dataAsArray:"+dataAsArray)
    dataAsArray.foreach(println )
    val sums = dataAsArray.reduce(
      (a,b) => a.zip(b).map( t => t._1 + t._2)
    )
    for(ele <- sums) println(ele)
    println("sums 数量:"+sums.length)

输出结果如下:

17/06/01 13:29:48 INFO BlockManagerInfo: Added broadcast_0_piece0 in memory on localhost:60540 (size: 9.8 KB, free: 1132.5 MB)
17/06/01 13:29:48 INFO SparkContext: Created broadcast 0 from textFile at zip.scala:72
----11122221-----
17/06/01 13:29:48 INFO FileInputFormat: Total input paths to process : 1
17/06/01 13:29:48 INFO SparkContext: Starting job: foreach at zip.scala:74
17/06/01 13:29:48 INFO DAGScheduler: Got job 0 (foreach at zip.scala:74) with 1 output partitions
17/06/01 13:29:48 INFO DAGScheduler: Final stage: ResultStage 0 (foreach at zip.scala:74)
17/06/01 13:29:48 INFO DAGScheduler: Parents of final stage: List()
17/06/01 13:29:48 INFO DAGScheduler: Missing parents: List()
17/06/01 13:29:48 INFO DAGScheduler: Submitting ResultStage 0 (E:\test1.csv MapPartitionsRDD[1] at textFile at zip.scala:72), which has no missing parents
17/06/01 13:29:48 INFO MemoryStore: Block broadcast_1 stored as values in memory (estimated size 3.0 KB, free 120.5 KB)
17/06/01 13:29:48 INFO MemoryStore: Block broadcast_1_piece0 stored as bytes in memory (estimated size 1799.0 B, free 122.2 KB)
17/06/01 13:29:48 INFO BlockManagerInfo: Added broadcast_1_piece0 in memory on localhost:60540 (size: 1799.0 B, free: 1132.5 MB)
17/06/01 13:29:48 INFO SparkContext: Created broadcast 1 from broadcast at DAGScheduler.scala:1006
17/06/01 13:29:48 INFO DAGScheduler: Submitting 1 missing tasks from ResultStage 0 (E:\test1.csv MapPartitionsRDD[1] at textFile at zip.scala:72)
17/06/01 13:29:48 INFO TaskSchedulerImpl: Adding task set 0.0 with 1 tasks
17/06/01 13:29:48 INFO TaskSetManager: Starting task 0.0 in stage 0.0 (TID 0, localhost, partition 0,PROCESS_LOCAL, 2120 bytes)
17/06/01 13:29:48 INFO Executor: Running task 0.0 in stage 0.0 (TID 0)
17/06/01 13:29:48 INFO HadoopRDD: Input split: file:/E:/test1.csv:0+21
17/06/01 13:29:48 INFO deprecation: mapred.tip.id is deprecated. Instead, use mapreduce.task.id
17/06/01 13:29:48 INFO deprecation: mapred.task.id is deprecated. Instead, use mapreduce.task.attempt.id
17/06/01 13:29:48 INFO deprecation: mapred.task.is.map is deprecated. Instead, use mapreduce.task.ismap
17/06/01 13:29:48 INFO deprecation: mapred.task.partition is deprecated. Instead, use mapreduce.task.partition
17/06/01 
### CEEMDAN KMeans 算法实现及应用 #### CEEMDAN 和 KMeans 的结合原理 CEEMDAN (Complete Ensemble Empirical Mode Decomposition with Adaptive Noise) 是一种信号处理技术,能够有效地将复杂的时间序列分解成多个固有模式函数(IMFs)[^1]。K-means 聚类算法则是一种无监督机器学习方法,旨在将数据集划分成若干个簇,使每个数据点到其所在簇中心的距离最小化。 当这两种技术结合起来时,首先利用 CEEMDAN 对原始时间序列进行多尺度分解,获得一系列 IMF 分量;接着提取各 IMF 组件的能量、熵、频率等特征参数,并以此作为输入喂给 K-means 算法来进行分类。这种组合方式有助于识别并分离出不同性质的波动成分,从而为进一步的数据分析提供了便利条件。 #### 实现过程中的关键技术要点 为了更好地理解如何具体实施这一流程,在此给出一个简化版 Python 伪代码框架: ```python import numpy as np from pyhht.emd import EMD from sklearn.cluster import KMeans def ceemdan_kmeans(data, num_imfs=5): """ 使用 CEEMDAN 和 KMeans 处理一维时间序列 参数: data -- 输入的一维数组形式的时间序列 num_imfs -- 需要计算的最大 IMFs 数目,默认为 5 返回值: labels -- 各 IMF 所属类别标签列表 centers -- 各类别对应的质心向量矩阵 """ # Step 1: Perform CEEMDAN decomposition on the input signal emd = EMD() imfs = emd.ceemdan(data) # Extract features from each IMF component feature_vectors = [] for i in range(num_imfs): energy = sum(imfs[i]**2) entropy = -np.sum((imfs[i]/energy)*np.log(abs(imfs[i])/energy)) freq = abs(np.fft.rfft(imfs[i])).mean() feature_vector = [energy, entropy, freq] feature_vectors.append(feature_vector) # Convert list of lists into a NumPy array X = np.array(feature_vectors).reshape(-1, len(feature_vectors[0])) # Apply k-means clustering algorithm to classify IMFs based on their extracted features model = KMeans(n_clusters=num_imfs//2+1, random_state=42) labels = model.fit_predict(X) centers = model.cluster_centers_ return labels, centers ``` 上述代码展示了怎样运用 `pyhht` 库执行 CEEMDAN 分解操作以及调用 scikit-learn 中内置的 KMeans 函数完成聚类任务。需要注意的是这只是一个非常基础的例子,实际应用场景下可能还需要考虑更多细节因素,比如预处理步骤的选择、模型超参数调整等问题。 #### 应用实例说明 在一个典型的应用场景中,假设有一个金融市场的股票价格走势记录下来形成了一条连续变化的时间序列。通过 CEEMDAN-KMeans 方法对其进行分析后发现某些特定类型的波动(如短期快速涨跌)往往集中在某一类别的IMF之中,而长期缓慢上升的趋势则主要体现在另一些类别里。因此可以根据这样的规律采取针对性策略——对于前者可设置止损位防止损失扩大;而对于后者,则可以在适当时候增加仓位获取更大收益。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值