楼主: kaifengedu
8895 9

[问答] 有序样品聚类分析在R里怎么实现? [推广有奖]

  • 0关注
  • 18粉丝

学科带头人

0%

还不是VIP/贵宾

-

威望
0
论坛币
1733 个
通用积分
473.1831
学术水平
85 点
热心指数
128 点
信用等级
60 点
经验
32602 点
帖子
897
精华
0
在线时间
1598 小时
注册时间
2010-2-2
最后登录
2024-6-8

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
各位好,
有序样品聚类分析在R里用什么命令实现?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:聚类分析 各位好

沙发
shaoshoutian 发表于 2012-11-3 09:16:56 |只看作者 |坛友微信交流群
恩的

使用道具

藤椅
trier2006 发表于 2012-11-3 18:28:59 |只看作者 |坛友微信交流群
帮顶
最好的医生是自己,最好的药物是时间……

使用道具

板凳
kaifengedu 发表于 2012-12-11 00:21:29 |只看作者 |坛友微信交流群
有人知道没,顶下?谢谢

使用道具

报纸
┌__洪阿比。 学生认证  发表于 2013-11-23 09:33:31 |只看作者 |坛友微信交流群
同求

使用道具

地板
DM小菜鸟 发表于 2014-12-30 15:56:53 |只看作者 |坛友微信交流群
可以这么来做

ocluster = function(datasam, classnum) {
    #有序样本聚类,输入datasam为样本数据阵,每一行为一个样本;
#输入classnum为要分的类数
#返回值result1为分类结果示意图
#各类的起始点存在变量breaks中
#输出三个矩阵 ra_dis:距离矩阵 leastlost:最小损失矩阵 classid:分类标识矩阵

#author:banmudi 2010.11



#样本数
    sam_n = dim(datasam)[1]

    #子函数,计算i-j个样本组成的类的半径
    radi = function(i, j) {
        #提取i-j个样本
        temp =as.matrix( datasam[i:j, ])
            mu = colMeans(matrix(temp,j-i+1))
            vec = apply(matrix(temp,j-i+1), 1, function(x) {
                x - mu
            })
            round(sum(apply(matrix(vec,j-i+1), 2, crossprod)),3)   

    }
   
   
    #计算距离矩阵
    ra_dis = matrix(0, sam_n, sam_n)
rownames(ra_dis) = 1:sam_n
    colnames(ra_dis) = 1:sam_n
    for (i in 1:(sam_n - 1)) {
        for (j in (i + 1):sam_n) {
            ra_dis[i, j] = radi(i, j)
            ra_dis[j, i] = radi(i, j)
        }
    }
   
    #最小损失矩阵,行为样本数,列为分类数
#leastlost[i,j]表示把1:i样本分成j类对应的最小损失
    leastlost = matrix(, sam_n - 1, sam_n - 1)
    rownames(leastlost) = 2:sam_n
    colnames(leastlost) = 2:sam_n
diag(leastlost) = 0
    #round(leastlost,3);

    #记录下对应的分类结点
    classid = matrix(, sam_n - 1, sam_n - 1)
    rownames(classid) = 2:sam_n
    colnames(classid) = 2:sam_n
    diag(classid) = 2:sam_n


    #分成两类时,填写最小损失阵的第一列
    leastlost[as.character(3:sam_n), "2"] = sapply(3:sam_n,
        function(xn) {
            min(ra_dis[1, 1:(xn - 1)] + ra_dis[2:xn, xn])
        })
    classid[as.character(3:sam_n), "2"] = sapply(3:sam_n, function(xn) {
        which((ra_dis[1, 1:(xn - 1)] + ra_dis[2:xn, xn]) == (min(ra_dis[1,
            1:(xn - 1)] + ra_dis[2:xn, xn])))[1] + 1
    })
    #分成j类时,填写最小损失阵的 第二列到最后一列
    for (j in as.character(3:(sam_n - 1))) {
        #分成j类
        leastlost[as.character((as.integer(j) + 1):sam_n), j] = sapply((as.integer(j) +
            1):sam_n, function(xn) {
            min(leastlost[as.character(j:xn - 1), as.character(as.integer(j) -
                1)] + ra_dis[j:xn, xn])
        })
      
        classid[as.character((as.integer(j) + 1):sam_n), j] = sapply((as.integer(j) +
            1):sam_n, function(xn) {
            a = which((leastlost[as.character(j:xn - 1), as.character(as.integer(j) -
                1)] + ra_dis[j:xn, xn]) == min(leastlost[as.character(j:xn -
                1), as.character(as.integer(j) - 1)] + ra_dis[j:xn,
                xn]))[1] + as.integer(j) - 1
        })
    }
   
    diag(classid) = 2:sam_n
   
    breaks = rep(0, 1, classnum)
    breaks[1] = 1
    breaks[classnum] = classid[as.character(sam_n), as.character(classnum)]
    flag = classnum - 1
    while (flag >= 2) {
        breaks[flag] = classid[as.character(breaks[flag + 1] -
            1), as.character(flag)]
        flag = flag - 1
    }

print("distance matrix:");#cat("\n")
print(ra_dis[2:sam_n,1:(sam_n-1)], na.print = ""); #输出距离矩阵
    print("leastlost matrix:")
print(leastlost[2:(sam_n-1),1:(sam_n-2)], na.print = ""); #输出最小损失矩阵
print("classid matrix:")
print(classid[2:(sam_n-1),1:(sam_n-2)], na.print = ""); #输出分类标识矩阵
    cat("\n")
print("result")
#画一个简单的分类示意图
    result1=NULL
    for (p in 1:sam_n) {
        result1 <- cat(result1,p, " ")
        for (w in 1:length(breaks)) {
            if (p == breaks[w] - 1) {
                result1 <- cat(result1, "||")
            }
        }
        if (p == sam_n)
           result1= cat(result1, "\n")
    }
}


已有 1 人评分学术水平 收起 理由
Timmy图 + 1 精彩帖子

总评分: 学术水平 + 1   查看全部评分

使用道具

7
285743489 发表于 2014-12-31 15:31:53 |只看作者 |坛友微信交流群
楼上不明觉厉啊

使用道具

8
boblan 发表于 2015-6-15 18:16:26 |只看作者 |坛友微信交流群
同问,哪位大神说说看

使用道具

9
Cherieling 发表于 2019-8-21 15:08:14 |只看作者 |坛友微信交流群
DM小菜鸟 发表于 2014-12-30 15:56
可以这么来做
ocluster = function(datasam, classnum) {
    #有序样本聚类,输入datasam为样本数据阵, ...
请问这个确定OK吗

使用道具

10
wen20 发表于 2022-5-4 12:42:35 |只看作者 |坛友微信交流群
DM小菜鸟 发表于 2014-12-30 15:56
可以这么来做
ocluster = function(datasam, classnum) {
    #有序样本聚类,输入datasam为样本数据阵, ...
请问这个数据应该怎么放进去,我是小白,不太明白

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-7-4 15:43