精华内容
下载资源
问答
  • 在R语言显示数学公式

    千次阅读 2019-06-17 23:50:45
    方法一直接利用expression 方法二利用latex2exp latex2exp包实际上是一种将latex语法转变为expression语句的辅助包。 install.packages('latex2exp') library(latex2exp) ...plot(1,1,main= TeX('$\\alpha^\\beta$'...

    方法一直接利用expression

    expression的用法及一些特殊符号的表达:
    https://blog.csdn.net/weixin_40628687/article/details/79280312

    方法二利用latex2exp

    latex2exp包实际上是一种将latex语法转变为expression语句的辅助包。

    install.packages('latex2exp')
    library(latex2exp)
    

    具体使用,例如:

    plot(1,1,main= TeX('$\\alpha^\\beta$'))
    

    注意这里T和X都是大写!!!

    实例:

    a<-0.6
    plot(1,1,main=TeX(paste0("$\\frac{\\beta}{\\alpha}$","=",a)))
    

    在这里插入图片描述

    展开全文
  • R语言数学计算

    2014-04-15 10:36:00
    R语言作为统计学一门语言,一直小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区迅速扩大成长。现在已不仅仅是统计领域,教育...

    R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

    R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

    要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

    关于作者:

    • 张丹(Conan), 程序员Java,R,PHP,Javascript
    • weibo:@Conan_Z
    • blog: http://blog.fens.me
    • email: bsspirit@gmail.com

    转载请注明出处:
    http://blog.fens.me/r-mathematics/

    r-math

    前言

    R是作为统计语言,生来就对数学有良好的支持,一个函数就能实现一种数学计算,所以用R语言做数学计算题特别方便。如果计算器中能嵌入R的计算函数,那么绝对是一种高科技产品。

    本文总结了R语言用于初等数学中的各种计算。

    目录

    1. 基本计算
    2. 三角函数计算
    3. 复数计算
    4. 方程计算

    1 基本计算

    四则运算: 加减乘除, 余数, 整除, 绝对值, 判断正负

    
    > a a+b;a-b;a*b;a/b
    [1] 15
    [1] 5
    [1] 50
    [1] 2
    
    # 余数,整除
    > a%%b;a%/%b
    [1] 0
    [1] 2
    
    # 绝对值
    > abs(-a)
    [1] 10
    
    # 判断正负
    > sign(-2:3)
    [1] -1 -1  0  1  1  1
    

    数学计算: 幂, 自然常用e的幂, 平方根, 对数

    
    > a c^b;c^-b;c^(b/10)
    [1] 1024
    [1] 0.0009765625
    [1] 2
    
    # 自然常数e
    > exp(1)
    [1] 2.718282
    
    # 自然常数e的幂
    > exp(3)
    [1] 20.08554
    
    # 平方根
    > sqrt(c)
    [1] 2
    
    # 以2为底的对数
    > log2(c)
    [1] 2
    # 以10为底的对数
    > log10(b)
    [1] 0.69897
    
    # 自定义底的对数
    > log(c,base = 2)
    [1] 2
    # 自然常数e的对数
    > log(a,base=exp(1))
    [1] 2.302585
    
    # 指数对数操作
    > log(a^b,base=a)
    [1] 5
    > log(exp(3))
    [1] 3
    

    比较计算: ==, >, =, isTRUE, identical

    
    > a a==a;a!=b;a>b;a=c
    [1] TRUE
    [1] TRUE
    [1] TRUE
    [1] FALSE
    [1] FALSE
    [1] TRUE
    
    # 判断是否为TRUE
    > isTRUE(a)
    [1] FALSE
    > isTRUE(!a)
    [1] FALSE
    
    # 精确比较两个对象
    > identical(1, as.integer(1))
    [1] FALSE
    > identical(NaN, -NaN)
    [1] TRUE
    
    > f  g  identical(f, g)
    [1] TRUE
    

    逻辑计算: &, |, &&, ||, xor

    
    > x y x && y;x || y
    [1] FALSE
    [1] FALSE
    
    # S4对象的逻辑运算,比较所有元素 &, |
    > x & y;x | y
    [1] FALSE FALSE FALSE  TRUE
    [1] FALSE  TRUE  TRUE  TRUE
    
    # 异或
    > xor(x,y)
    [1] FALSE  TRUE  TRUE FALSE
    > xor(x,!y)
    [1]  TRUE FALSE FALSE  TRUE
    

    约数计算: ceiling,floor,trunc,round,signif

    
    # 向上取整
    > ceiling(5.4)
    [1] 6
    
    # 向下取整
    > floor(5.8)
    [1] 5
    
    # 取整数
    > trunc(3.9)
    [1] 3
    
    # 四舍五入
    > round(5.8)
    
    # 四舍五入,保留2位小数
    > round(5.8833, 2)
    [1] 5.88
    
    # 四舍五入,保留前2位整数
    > signif(5990000,2)
    [1] 6e+06
    

    数组计算: 最大, 最小, 范围, 求和, 均值, 加权平均, 连乘, 差分, 秩,,中位数, 分位数, 任意数,全体数

    
    > d max(d);min(d);range(d)
    [1] 9
    [1] 1
    [1] 1 9
    
    # 求和,均值
    > sum(d),mean(d)
    [1] 25
    [1] 5
    
    # 加权平均
    > weighted.mean(d,rep(1,5))
    [1] 5
    > weighted.mean(d,c(1,1,2,2,2))
    [1] 5.75
    
    # 连乘
    > prod(1:5)
    [1] 120
    
    # 差分
    > diff(d)
    [1] 2 2 2 2
    
    # 秩
    > rank(d)
    [1] 1 2 3 4 5
    
    # 中位数
    > median(d)
    [1] 5
    
    # 分位数
    > quantile(d)
    0%  25%  50%  75% 100%
    1    3    5    7    9
    
    # 任意any,全体all
    > e any(e<0);all(e<0)
    [1] TRUE
    [1] FALSE
    

    排列组合计算: 阶乘, 组合, 排列

    
    # 5!阶乘
    > factorial(5)
    [1] 120
    
    # 组合, 从5个中选出2个
    > choose(5, 2)
    [1] 10
    
    # 列出从5个中选出2个的组合所有项
    > combn(5,2)
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    [1,]    1    1    1    1    2    2    2    3    3     4
    [2,]    2    3    4    5    3    4    5    4    5     5
    
    # 计算0:10的组合个数
    > for (n in 0:10) print(choose(n, k = 0:n))
    [1] 1
    [1] 1 1
    [1] 1 2 1
    [1] 1 3 3 1
    [1] 1 4 6 4 1
    [1]  1  5 10 10  5  1
    [1]  1  6 15 20 15  6  1
    [1]  1  7 21 35 35 21  7  1
    [1]  1  8 28 56 70 56 28  8  1
    [1]   1   9  36  84 126 126  84  36   9   1
    [1]   1  10  45 120 210 252 210 120  45  10   1
    
    # 排列,从5个中选出2个
    > choose(5, 2)*factorial(2)
    [1] 20
    

    累积计算: 累加, 累乘, 最小累积, 最大累积

    
    # 累加
    > cumsum(1:5)
    [1]  1  3  6 10 15
    
    # 累乘
    > cumprod(1:5)
    [1]   1   2   6  24 120
    
    > e cummin(e)
    [1] -3 -3 -3 -3 -3 -3 -3
    # 最大累积cummax
    > cummax(e)
    [1] -3 -2 -1  0  1  2  3
    

    两个数组计算: 交集, 并集, 差集, 数组是否相等, 取唯一, 查匹配元素的索引, 找重复元素索引

    
    # 定义两个数组向量
    > x  y intersect(x,y)
    [1]  9 10  1  2  3  4  5  6  7  8
    
    # 并集
    > union(x,y)
     [1]  9 10 11 12 13 14 15 16 17 18 19 20  1  2  3  4  5
    [18]  6  7  0  8
    
    # 差集,从x中排除y
    > setdiff(x,y)
     [1] 11 12 13 14 15 16 17 18 19 20  0
    
    # 判断是否相等
    > setequal(x, y)
    [1] FALSE
    
    # 取唯一
    > unique(c(x,y))
     [1]  9 10 11 12 13 14 15 16 17 18 19 20  1  2  3  4  5
    [18]  6  7  0  8
    
    # 找到x在y中存在的元素的索引
    > which(x %in% y)
     [1]  1  2 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28
    [18] 29 30 31
    > which(is.element(x,y))
     [1]  1  2 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28
    [18] 29 30 31
    
    # 找到重复元素的索引
    > which(duplicated(x))
     [1] 18 19 20 24 25 26 27 28 29 30
    

    2 三角函数计算

    2.1 三角函数

    在直角三角形中仅有锐角(大小在0到90度之间的角)三角函数的定义。给定一个锐角θ,可以做出一个直角三角形,使得其中的一个内角是θ。设这个三角形中,θ的对边、邻边和斜边长度分别是a、b和h。

    Trigonometry_triangle_sim

    三角函数的6种关系:正弦,余弦,正切,余切,正割,余割。

    • θ的正弦是对边与斜边的比值:sin θ = a/h
    • θ的余弦是邻边与斜边的比值:cos θ = b/h
    • θ的正切是对边与邻边的比值:tan θ = a/b
    • θ的余切是邻边与对边的比值:cot θ = b/a
    • θ的正割是斜边与邻边的比值:sec θ = h/b
    • θ的余割是斜边与对边的比值:csc θ = h/a

    三角函数的特殊值:

    
    函数    0     pi/12                  pi/6          pi/4           pi/3             5/(12*pi)              pi/2
    sin     0     (sqrt(6)-sqrt(2))/4    1/2           sqrt(2)/2      sqrt(3)/2        (sqrt(6)+sqrt(2))/4    1
    cos     1     (sqrt(6)+sqrt(2))/4    sqrt(3)/2     sqrt(2)/2      1/2              (sqrt(6)-sqrt(2))/4    0
    tan     0     2-sqrt(3)              sqrt(3)/3     1              sqrt(3)          2+sqrt(3)              NA
    cot     NA    2+sqrt(3)              sqrt(3)       1              sqrt(3)/3        2-sqrt(3)              0
    sec     1     sqrt(6)-sqrt(2)        sqrt(3)*2/3   sqrt(2)        2                sqrt(6)-sqrt(2)        NA
    csc     NA    2                      sqrt(2)       sqrt(3)*2/3    sqrt(6)-sqrt(2)  1                      NA
    

    三角基本函数: 正弦,余弦,正切

    
    # 正弦
    > sin(0);sin(1);sin(pi/2)
    [1] 0
    [1] 0.841471
    [1] 1
    
    # 余弦
    > cos(0);cos(1);cos(pi)
    [1] 1
    [1] 0.5403023
    [1] -1
    
    # 正切
    > tan(0);tan(1);tan(pi)
    [1] 0
    [1] 1.557408
    [1] -1.224647e-16
    

    接下来,我们用ggplot2包来画出三角函数的图形。

    
    # 加载ggplot2的库
    > library(ggplot2)
    > library(scales)
    

    三角函数画图

    
    # x坐标
    > x s1 s2 s3 s4 s5 s6 df g g g g g
    

    triple-pic

    2.1 反三角函数

    基本的反三角函数定义:

    
    反三角函数	     定义	         值域
    arcsin(x) = y  	 sin(y) = x  	 - pi/2 <= y <= pi/2
    arccos(x) = y  	 cos(y) = x      0 <= y <= pi,
    arctan(x) = y  	 tan(y) = x      - pi/2 < y < pi/2
    arccsc(x) = y  	 csc(y) = x      - pi/2 <= y <= pi/2, y!=0
    arcsec(x) = y  	 sec(y) = x      0 <= y <= pi, y!=pi/2
    arccot(x) = y  	 cot(y) = x      0 <  y <  pi
    

    反正弦,反余弦,反正切

    
    # 反正弦asin
    > asin(0);asin(1)
    [1] 0
    [1] 1.570796  # pi/2=1.570796
    
    # 反余弦acos
    > acos(0);acos(1)
    [1] 1.570796 # pi/2=1.570796
    [1] 0
    
    # 反正切atan
    > atan(0);atan(1)
    [1] 0
    [1] 0.7853982 # pi/4=0.7853982
    

    反三角函数画图

    
    # x坐标
    > x s1 s2 s3 s4 s5 s6 df g g g g
    

    arc-pic

    2.3 三角函数公式

    接下来,用单元测试的方式,来描述三角函数的数学公式。通过testthat包,进行单元测试,关于testthat包的安装和使用,请参考文章:在巨人的肩膀前行 催化R包开发

    
    # 加载testthat包
    > library(testthat)
    
    # 定义变量
    > a

    平方和公式:

    • sin(x)^2+cos(x)^2 = 1
    
    expect_that(sin(a)^2+cos(a)^2,equals(1))
    

    和角公式

    • sin(a+b) = sin(a)*cos(b)+sin(b)*cos(a)
    • sin(a-b) = sin(a)*cos(b)-sin(b)*cos(a)
    • cos(a+b) = cos(a)*cos(b)-sin(b)*sin(a)
    • cos(a-b) = cos(a)*cos(b)+sin(b)*sin(a)
    • tan(a+b) = (tan(a)+tan(b))/(1-tan(a)*tan(b))
    • tan(a-b) = (tan(a)-tan(b))/(1+tan(a)*tan(b))
    
    expect_that(sin(a)*cos(b)+sin(b)*cos(a),equals(sin(a+b)))
    expect_that(sin(a)*cos(b)-sin(b)*cos(a),equals(sin(a-b)))
    expect_that(cos(a)*cos(b)-sin(b)*sin(a),equals(cos(a+b)))
    expect_that(cos(a)*cos(b)+sin(b)*sin(a),equals(cos(a-b)))
    expect_that((tan(a)+tan(b))/(1-tan(a)*tan(b)),equals(tan(a+b)))
    expect_that((tan(a)-tan(b))/(1+tan(a)*tan(b)),equals(tan(a-b)))
    

    2倍角公式

    • sin(2*a) = 2*sin(a)*cos(a)
    • cos(2*a) = cos(a)^2-sin(a)^2=2*cos(a)^2-1=1-2*sin2(a)
    
    expect_that(cos(a)^2-sin(a)^2,equals(cos(2*a)))
    expect_that(2*cos(a)^2-1,equals(cos(2*a)))
    expect_that(1-2*sin(a)^2,equals(cos(2*a)))
    

    3倍角公式

    • cos(3*a) = 4*cos(a)^3-3*cos(a)
    • sin(3*a) = -4*sin(a)^3+3*sin(a)
    
    expect_that(4*cos(a)^3-3*cos(a),equals(cos(3*a)))
    expect_that(-4*sin(a)^3+3*sin(a),equals(sin(3*a)))
    

    半角公式

    • sin(a/2) = sqrt((1-cos(a))/2)
    • cos(a/2) = sqrt((1+cos(a))/2)
    • tan(a/2) = sqrt((1-cos(a))/(1+cos(a))) = sin(a)/(1+cos(a)) = (1-cos(a))/sin(a)
    
    expect_that(sqrt((1-cos(a))/2),equals(abs(sin(a/2))))
    expect_that(sqrt((1+cos(a))/2),equals(abs(cos(a/2))))
    expect_that(sqrt((1-cos(a))/(1+cos(a))),equals(abs(tan(a/2))))
    expect_that(abs(sin(a)/(1+cos(a))),equals(abs(tan(a/2))))
    expect_that(abs((1-cos(a))/sin(a)),equals(abs(tan(a/2))))
    

    和差化积

    • sin(a)*cos(b) = (sin(a+b)+sin(a-b))/2
    • cos(a)*sin(b) = (sin(a+b)-sin(a-b))/2
    • cos(a)*cos(b) = (cos(a+b)+cos(a-b))/2
    • sin(a)*sin(b) = (cos(a-b)-cos(a+b))/2
    
    expect_that((sin(a+b)+sin(a-b))/2,equals(sin(a)*cos(b)))
    expect_that((sin(a+b)-sin(a-b))/2,equals(cos(a)*sin(b)))
    expect_that((cos(a+b)+cos(a-b))/2,equals(cos(a)*cos(b)))
    expect_that((cos(a-b)-cos(a+b))/2,equals(sin(a)*sin(b)))
    

    积化和差

    • sin(a)+sin(b) = 2*sin((a+b)/2)*cos((a+b)/2)
    • sin(a)-sin(b) = 2*cos((a+b)/2)*cos((a-b)/2)
    • cos(a)+cos(b) = 2*cos((a+b)/2)*cos((a-b)/2)
    • cos(a)-cos(b) = -2*sin((a+b)/2)*sin((a-b)/2)
    
    expect_that(sin(a)+sin(b),equals(2*sin((a+b)/2)*cos((a-b)/2)))
    expect_that(sin(a)-sin(b),equals(2*cos((a+b)/2)*sin((a-b)/2)))
    expect_that(2*cos((a+b)/2)*cos((a-b)/2),equals(cos(a)+cos(b)))
    expect_that(-2*sin((a+b)/2)*sin((a-b)/2),equals(cos(a)-cos(b)))
    

    万能公式

    • sin(2*a)=2*tan(a)/(1+tan(a)^2)
    • cos(2*a)=(1-tan(a)^2)/(1+tan(a)^2)
    • tan(2*a)=2*tan(a)/(1-tan(a)^2)
    
    expect_that(sin(2*a),equals(2*tan(a)/(1+tan(a)^2)))
    expect_that((1-tan(a)^2)/(1+tan(a)^2),equals(cos(2*a)))
    expect_that(2*tan(a)/(1-tan(a)^2),equals(tan(2*a)))
    

    平方差公式

    • sin(a+b)*sin(a-b)=sin(a)^2+sin(b)^2
    • cos(a+b)*cos(a-b)=cos(a)^2+sin(b)^2
    
    expect_that(sin(a)^2-sin(b)^2,equals(sin(a+b)*sin(a-b)))
    expect_that(cos(a)^2-sin(b)^2,equals(cos(a+b)*cos(a-b)))
    

    降次升角公式

    • cos(a)^2=(1+cos(2*a))/2
    • sin(a)^2=(1-cos(2*a))/2
    
    expect_that((1+cos(2*a))/2,equals(cos(a)^2))
    expect_that((1-cos(2*a))/2,equals(sin(a)^2))
    

    辅助角公式

    • a*sin(a)+b*cos(a) = sqrt(a^2+b^2)*sin(a+atan(b/a))
    
    expect_that(sqrt(a^2+b^2)*sin(a+atan(b/a)),equals(a*sin(a)+b*cos(a)))
    

    3 复数计算

    复数,为实数的延伸,它使任一多项式都有根。复数中的虚数单位i,是-1的一个平方根,即i^2 = -1。任一复数都可表达为x + yi,其中x及y皆为实数,分别称为复数之“实部”和“虚部”。

    3.1 创建一个复数

    
    # 直接创建复数
    > ai class(ai)
    [1] "complex"
    
    # 通过complex()函数创建复数
    > bi is.complex(bi)
    [1] TRUE
    
    # 实数部分
    > Re(ai)
    [1] 5
    
    # 虚数部分
    > Im(ai)
    [1] 2
    
    # 取模
    > Mod(ai)
    [1] 5.385165 # sqrt(5^2+2^2) = 5.385165
    
    # 取辐角
    > Arg(ai)
    [1] 0.3805064
    
    # 取轭
    > Conj(ai)
    [1] 5-2i
    

    3.2 复数四则运算

    • 加法公式:(a+bi)+(c+di) = (a+c)+(b+d)i
    • 减法公式:(a+bi)-(c+di)= (a-c)+(b-d)i
    • 乘法公式:(a+bi)(c+di) = ac+adi+bci+bidi=ac+bdi^2+(ad+bc)i=(ac-bd)+(ad+bc)i
    • 除法公式:(a+bi)/(c+di) = ((ac+bd)+(bc-ad)i)/(c^2+d^2)
    
    # 定义系数
    a

    3.3 复数开平方根

    
    # 在实数域,给-9开平方根
    > sqrt(-9)
    [1] NaN
    
    # 在复数域,给-9开平方根
    > sqrt(complex(real=-9))
    [1] 0+3i
    

    4 方程计算

    方程计算是数学计算的一种基本形式,R语言也可以很方便地帮助我们解方程,下面将介绍一元多次的方程,和二元一次方程的解法。

    解一元多次方程,可以用uniroot()函数!

    4.1 一元一次方程

    一元一次方程:a*x+b=0,设a=5,b=10,求x?

    
    # 定义方程函数
    > f1  a result  result$root
    [1] -2
    

    一元一次方程非常容易解得,方程的根是-2!

    以图形展示方程:y = 5*x + 10

    
    # 创建数据点
    > x y df g g g g g g
    

    f1

    4.2 一元二次方程

    一元二次方程:a*x^2+b*x+c=0,设a=1,b=5,c=6,求x?

    
    > f2  a result  result$root
    [1] -2
    

    把参数带入方程,用uniroot()函数,我们就解出了方程的一个根,改变计算的区间,我们就可以得到另一个根。

    
    > result  result$root
    [1] -3
    

    方程的两个根,一个是-2,一个是-3。

    由于uniroot()函数,每次只能计算一个根,而且要求输入的区间端值,必须是正负号相反的。如果我们直接输入一个(-10,0)这个区间,那么uniroot()函数会出现错误。

    
    > result 

    这应该是uniroot()为了统计计算对一元多次方程而设计的,所以为了使用uniroot()函数,我们需要取不同的区别来获得方程的根。

    以图形展示方程:y = x^2 + 5*x + 6

    
    # 创建数据点
    > x y df g g g g g
    

    y2

    我们从图,并直接的看到了x的两个根取值范围。

    4.3 一元三次方程

    一元二次方程:a*x^3+b*x^2+c*x+d=0,设a=1,b=5,c=6,d=-11,求x?

    
    > f3  a result  result$root
    [1] 0.9461458
    

    如果我们设置对了取值区间,那么一下就得到了方程的根。

    以图形展示方程:y = x^2 + 5*x + 6

    
    # 创建数据点
    > x y df g g g g g
    

    y3

    4.4 二元一次方程组

    R语言还可以解二次的方程组,当然计算方法,其实是利用于矩阵计算。

    假设方程组:是以x1,x2两个变量组成的方程组,求x1,x2的值

    fm1

    以矩阵形式,构建方程组

    fm2

    
    # 左矩阵
    > lf rf result result
         [,1]
    [1,]    3
    [2,]   -1
    

    得方程组的解,x1, x2分别为3和-1。

    接下来,我们画出这两个线性方程的图。设y=X2, x=X1,把原方程组变成两个函数形式。

    
    # 定义2个函数
    > fy1 fy2 x y1 y2 dy1 dy2 df  g g g g
    

    y4

    我们看到两条直线交点的坐标,就是方程组的两个根。多元一次方程,同样可以用这种方法来解得。

    通过R语言,我们实现了对于初等数学的各种计算,真的是非常方便!下一篇文章将介绍,用R语言来解决高级数学中的计算问题。

    转载请注明出处:
    http://blog.fens.me/r-mathematics/

    打赏作者

    This entry was posted in R语言实践

    展开全文
  • 该方法软件的实现也散布于各类教材及网上的博文,笔者本文总结了聚类分析方法三种常用软件:SPSS、Matlab与R中的实现,通过几个简单的数据实例介绍各种软件的具体分析过程,供读者参考,三种软件各有...

    原文:https://mp.weixin.qq.com/s/1aBlwX11cBxw0sxONaHJRQ

    笔记:修改后代码

    a<-scan()
    7.90 39.77  8.49 12.94 19.27 11.05 2.04 13.29
    7.68 50.37 11.35 13.30 19.25 14.59 2.75 14.87
    9.42 27.93  8.20  8.14 16.17  9.42 1.55  9.76
    9.16 27.98  9.01  9.32 15.99  9.10 1.82 11.35
    10.06 28.64 10.52 10.05 16.18  8.39 1.96 10.81
    provinceData<-matrix(a,5)
    rownames(provinceData)<-c("辽宁","浙江",'河南','甘肃','青海')

    d<-dist(provinceData,method="euclidean",diag=T,upper=F,p=2) ;d

    HC<-hclust(d,method="complete") 

    library(showtext)

    plot(HC,hang=-1)  #hang是表明谱系图中各类所在的位置
    showtext_begin()

    re4<-rect.hclust(HC,k=2,border="green");
    showtext_end()

    a<-scan()
    99.00 98.00 78.00 80.00
    88.00 89.00 89.00 90.00
    79.00 80.00 95.00 97.00
    89.00 78.00 81.00 82.00
    75.00 78.00 95.00 96.00
    60.00 65.00 85.00 88.00
    79.00 87.00 50.00 51.00
    75.00 76.00 88.00 89.00
    60.00 56.00 89.00 90.00
    100.00 100.00 85.00 84.00

    score.data<-matrix(a,10)

    colnames(score.data)<-c('数学','物理','语文','政治')

    corMat<-cor(   score.data[,c(1,2,3,4)]    )

    d<-   as.dist(   1-corMat^2   )

    hc<-hclust(   d,method="average"   )

    companyData<-scan()
    80.00  85.00   75.00   90.00
    85.00   85.00   90.00   90.00
    85.00   85.00   86.00   60.00
    90.00   90.00   75.00   90.00
    99.00   98.00   78.00   80.00
    88.00   89.00   89.00   90.00
    79.00   80.00   95.00   97.00
    89.00   78.00   81.00   82.00
    75.00   78.00   95.00   96.00
    60.00   65.00   85.00   88.00
    79.00   87.00   50.00   51.00
    75.00   76.00   88.00   89.00
    60.00   56.00   89.00   90.00
    100.00  100.00   85.00   84.00
    61.00   64.00   89.00   60.00

    companyData<-matrix(companyData,,4)

    colnames(companyData)<-c('组织文化' ,'组织氛围' ,'领导角色','员工发展')

    KM<-kmeans(companyData[,c(1,2,3,4)],3,nstart=3,algorithm="Hartigan-Wong") ;KM

     

    1、引言

            聚类分析是一种经典的多元数据分析方法,在各领域有着广泛的应用,其统计思想及数学过程在各种多元统计分析教材中都有详细介绍。该方法在软件中的实现也散布于各类教材及网上的博文中,笔者在本文中总结了聚类分析方法在三种常用软件:SPSS、Matlab与R中的实现,通过几个简单的数据实例介绍各种软件的具体分析过程,供读者参考,三种软件各有优劣,读者可根据自身情况加以选择使用。说明:下文所用数据在许多教材和网上博文中都可见到,原始出处已无从追溯,故不再说明来源。

    2、系统聚类法

    2.1  样本聚类

    例1:为了研究辽宁等5省区某年城镇居民生活消费的分布规律,根据调查资料做类型划分。

    2.1.1  在SPSS中的实现

            在SPSS中通过点击菜单选项的方式分以下几步实现聚类过程:

    1. 打开数据文件,点击菜单Analyze —> Classify —> Hierarchical cluster。

    2. 将变量province输入Label cases by对应的框中,变量X1-X8输入variables框中,cluster选项框默认选择Cases,即对样品聚类

    3. 单击Statistics,出现对话框,选择Agglomeration schedule输出聚类过程表和Proximity matrix关系矩阵。不事先确定分类数的话在Cluster membership下默认第一项,事先确定类数的话可选择第二项并输入相应类数,然后单击Continue。

    4. 单击Plots,出现对话框,选择Dendrogram系统树图。Icicle(冰柱图)选择All clusters,Orientation选择Vertical,单击Continue。

    5. 单击Method,出现对话框,此对话框设置样本点间距离和类间距离计算方法,以及是否对原始数据进行变换等。此处我们对样本点间距离使用平方欧氏距离,类间距离用Furthest neighbor计算,不做其他数据变换,单击Continue。

    6. 上一步结束后返回对话框,单击OK,此时出现结果输出页面。下面依次是主要输出结果,下图是距离矩阵,按前述设置计算的样本点间距离。

    7. 下面三个图表分别是输出的聚类过程表,冰柱图和谱系图。

    结论:从冰柱图、谱系图看,本问题分成两类是比较合适的,即河南、青海、甘肃为一类;浙江、辽宁为一类。

    2.1.2  在Matlab中的实现

    Matlab中实现系统聚类主要有三个命令,分别是pdist(),linkage()和dendrogram()。

    其中pdist()函数计算样品间距离,得到的结果为一距离向量,分别是(2,1),(3,1),…,(n,1),(3,2),…,(n,2),…,(n,n-1)对样品间的距离;

    linkage()函数利用指定的方法,如最短距离,最长距离,平均距离等建立系统聚类树

    最后由den drogram()函数画出聚类树形图。代码如下:

    %%系统聚类法
    provinceData=[7.90 39.77 8.49 12.94 19.27 11.05 2.04 13.29;
    7.68  50.37  11.35  13.30  19.25  14.59  2.75   14.87;
    9.42  27.93  8.20   8.14   16.17  9.42   1.55   9.76;
    9.16  27.98  9.01   9.32   15.99  9.10   1.82   11.35;
    10.06 28.64  10.52  10.05  16.18  8.39   1.96   10.81];
    
    
    %pdist()函数计算样品间距离,得到的结果为一距离向量
    
    d1=pdist(provinceData);
    %计算距离方法默认为欧氏距离,即`euclidean`,  
    %其他可选项有'cityblock','minkowski'等  
    
    D1=squareform(d1);%距离向量转换为矩阵形式
    
    %linkage()函数利用指定的方法,如最短距离,最长距离,平均距离等建立系统聚类树
    
    z1=linkage(d1,'complete');%疑问:这里是d1还是转化为矩阵的D1?
    %根据指定类间距离计算方法计算类间距离,
    %可选项有'singe','centroid','ward','average'等  
    
    varlabel={'辽宁','浙江','河南','甘肃','青海'};%在聚类图上给相应样品命名
    
    %den drogram()函数画出聚类树形图
    
    H1=dendrogram(z1,'labels',varlabel)

    Matlab还可输出不同分类数下样品所在类的结果,即 

    T1=cluster(z1,2)  %其中2是分类数,输出每个样品的分类结果
    
    find(T1==1)  %找出属于某个类的样品编号,此处为输出第一类样品序号

    关于聚类效果的优劣,Matlab还提供了一个cophenet()命令,用以计算系统聚类树的Cophenetic相关系数,该系数可用来对比各种不同的距离计算和不同的类间距离定义下的聚类效果,该值越接近于1,表明聚类效果越好。很多情形下,不同距离的计算方法对该系数值影响较小。

    2.1.3  在R中的实现

     R中实现系统聚类主要命令,分别是dist()、hclust(),和Matlab中的pdist()、linkage()功能基本一致,最后由plot()函数画出聚类树形图。

    provinceData<-read.table("E:/Datasource4R/provinceData.txt",header=T)

    provinceData<-as.matrix(    provinceData [ , c(-1) ]         )

    rownames      (provinceData)<-c("辽宁","浙江",'河南','甘肃','青海')


    d<-    dist(     provinceData,method="euclidean",diag=T,upper=F,p=2     ) 
    HC<-hclust(    d,method="complete"        ) 


    showtext_begin()

    plot(HC,hang=-1)  #hang是表明谱系图中各类所在的位置

    re4<-rect.hclust(     HC,k=2,border="green"        );

    showtext_end()

    R的作图功能很强大,可以利用rect.hclust()函数在聚类图上画出事先指定的类数的分类情况,并用矩形框框起来,非常直观。另外,利用R的ape包还可以画其他类型的各种有意思的谱系图,见下图。横向谱系图、进化分枝图、扇形谱系图、unrooted谱系图

    2.2  变量聚类

     例2:为了研究学科之间的关系,根据学生成绩对科目作聚类分析。

    2.2.1  在SPSS中的实现

    变量系统聚类与样品系统聚类在SPSS中的实现步骤基本一致,除了在下述第二步中的选项由Cases变为Variables之外。在SPSS中通过点击菜单选项的方式分以下几步实现变量系统聚类过程:

    1.打开数据文件,点击菜单Analyze —> Classify —> Hierarchical cluster。

    2.将4个变量输入variables框中,在Cluster选项框中选择Variables,表明要做变量聚类。

    3.单击Statistics,出现对话框,选择Agglomeration schedule和Proximity matrix。不事先确定分类数的话在Cluster membership下默认第一项,事先确定类数的话可选择第二项并输入相应类数,然后单击Continue。

    4.单击Plots,出现对话框,选择Dendrogram。Icicle(冰柱图)选择All clusters,Orientation选择Horizontal(Vertical亦可),单击Continue。

    5.单击Method,出现对话框,此对话框设置样本点间距离类间距离计算方法,以及是否对原始数据进行变换等。此处我们对样本点间距离使用Pearson系数,类间距离用Between-groups linkage方法,不做其他数据变换,单击Continue。

    6.上一步结束后返回对话框,单击OK,此时出现结果输出页面。下面依次介绍一下主要输出结果,图21是距离矩阵和聚类过程表,按前述设置计算的样本点间距离及并类过程

    7.下两图分别是输出的冰柱图和谱系图。

    2.2.2  在Matlab中的实现

    Matlab中实现变量系统聚类与样品系统聚类过程一致,下面直接给出代码及结果。代码如下:

    %%变量系统聚类
    scoreData=[99.00 98.00 78.00 80.00;
    88.00 89.00 89.00 90.00;
    79.00 80.00 95.00 97.00;
    89.00 78.00 81.00 82.00;
    75.00 78.00 95.00 96.00;
    60.00 65.00 85.00 88.00;
    79.00 87.00 50.00 51.00;
    75.00 76.00 88.00 89.00;
    60.00 56.00 89.00 90.00;
    100.00 100.00 85.00 84.00];  %%1,2,3,4列分别对应数学、物理、语文、政治
    
    d1=pdist(    scoreData','correlation'       )
    varlabel     ={'数学','物理','语文','政治'};
    
    z1=linkage(     d1,'average'       )
    
    H2 = dendrogram(    z1,0,'orientation','right','labels',varlabel    )
    
    T1=cluster(z1,2)  % 2是分类数  输出每个变量的分类结果
    find(T1==2)  %% 找出属于某个类的变量编号

     

    2.2.3  在R中的实现

    R中实现变量系统聚类也与样品系统聚类过程一致,不再详述。

    score.data<-read.table("E:/Datasource4R/scoreData.txt",header=T)
    
    corMat<-cor(   score.data[,c(-1)]    )
    d<-   as.dist(   1-corMat^2   )
    hc<-hclust(   d,method="average"   )

    另外值得一提的是,利用R的corrplot包可以作出非常直观的相关系数矩阵图,作为分类的参考也很直观。有Matlab爱好者也把这种图的生成编成Matlab函数,并将代码放在网上供大家下载,感兴趣的读者可以自行搜索。

    3、K均值聚类法

    例3:为研究不同公司的运营特点,调查了15个公司的组织文化、组织氛围、领导角色和员工发展4方面的内容。现要将这15个公司按照其各自的特点进行分成4类,数据如下所示。

    3.1  在SPSS中的实现

    在SPSS中通过点击菜单选项的方式分以下几步实现k均值聚类过程:

    1. 打开数据文件,点击菜单Analyze —> Classify —> K-Means cluster。

    2. 将变量“公司”输入Label cases by对应的框中,其余4个变量输入variables框中,Number of cluster选项框填4(即事先确定好的类数)。

    3. 单击Iterate,出现对话框,填最大迭代次数,默认即可,然后单击ontinue。

    4. 单击Save,出现对话框,两个选项都选上,单击Continue。

    5. 单击Options,出现对话框,如下图选择。

    6. 上一步结束后返回对话框,单击OK,此时出现结果输出页面。下面依次是主要输出结果,下图是初始聚类中心和迭代历史。

    7. 下两图分别是输出的各个类的成员信息以及最终聚类中心等其他信息。

    3.2  在Matlab中的实现

    Matlab实现K均值聚类的命令如下:

    companyData=[80.00  85.00   75.00   90.00;
                85.00   85.00   90.00   90.00;
                85.00   85.00   86.00   60.00;
                90.00   90.00   75.00   90.00;
                99.00   98.00   78.00   80.00;
                88.00   89.00   89.00   90.00;
                79.00   80.00   95.00   97.00;
                89.00   78.00   81.00   82.00;
                75.00   78.00   95.00   96.00;
                60.00   65.00   85.00   88.00;
                79.00   87.00   50.00   51.00;
                75.00   76.00   88.00   89.00;
                60.00   56.00   89.00   90.00;
               100.00  100.00   85.00   84.00;
                61.00   64.00   89.00   60.00];
    
    opts = statset('Display','final');
    
    [Idx,Ctrs,SumD,D] = kmeans(companyData,3,'Replicates',6,'Options',opts);
    %调用Kmeans函数
    %Idx N*1的向量,存储的是每个点的聚类标号
    %Ctrs K*P的矩阵,存储的是K个聚类质心位置
    %SumD 1*K的和向量,存储的是类间所有点与该类质心点距离之和
    %D N*K的矩阵,存储的是每个点与所有质心的距离;

    Matlab还提供了一个silhouette()函数用以绘制聚类轮廓图,可根据图判断样品的聚类合理性

    [S, H] = silhouette(companyData,Idx)

     

    3.3  在R中的实现

    R中实现K均值聚类的代码及输出结果如下:

    companyData<-   read.table("E:/Datasource4R/companyData.txt",header=T)
    KM<-kmeans(companyData[,c(-1)],      3,nstart=3,     algorithm="Hartigan-Wong") 
    KM
    ## K-means clustering with 3 clusters of sizes 10, 3, 2
    ## 
    ## Cluster means:
    ##   组织文化 组织氛围 领导角色 员工发展
    ## 1 86.00000 85.90000 85.10000 88.80000
    ## 2 60.33333 61.66667 87.66667 79.33333
    ## 3 82.00000 86.00000 68.00000 55.50000
    ## 
    ## Clustering vector:
    ##  [1] 1 1 3 1 1 1 1 1 1 2 3 1 2 1 2
    ## 
    ## Within cluster sum of squares by cluster:
    ## [1] 2139.4000  622.6667  708.5000
    ##  (between_SS / total_SS =  60.8 %)

    致谢原文:https://mp.weixin.qq.com/s/1aBlwX11cBxw0sxONaHJRQ

    感谢上帝的带领,祈求上帝使我长进,在基督里得着怜悯和恩惠。

    展开全文
  • MatLab R2018a是一款十分实用的数学软件,用户编程开发的过程绝对离不开这款软件,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域,本平台提供最新的MatLab R...
  • 内容完全是根据数学建模竞赛的需要而编排的,涵盖r绝大部分数学建模问题的MATI_AI3求解方法。全书内容分__巨下两篇。_卜篇介绍数学建模常规方法的MATI_AI3实现,包括MATI_AI3交互、数据建模、程序绘图、灰色...
  • R语言如何输出数学表达式文本

    千次阅读 2020-04-10 14:14:07
    在R语言,输出图添加一些数据表达式,可以增加图的解释性。 基本语法是:通过 expression 函数转化相应的表达式术语为用户友好型的表达式 library(ggplot2) x <- 1:100 y <- 1 / x df <- dat...

    基本语法

    在R语言中,输出图中添加一些数据表达式,可以增加图的解释性。
    基本语法是:通过 expression 函数转化相应的表达式术语为用户友好型的表达式

    library(ggplot2)
    x <- 1:100
    y <- 1 / x
    df <- data.frame(x = x, y = y)
    ggplot(data = df, aes(x = x, y = y)) +
      geom_line() +
      labs(y = expression(paste("y = ", frac(1, x))))
    

     expression

    常见的R数学表达式语法

    基础运算符

    基础运算符

    高等数学常见运算符

    高等数学

    上下标

    上下标

    箭头符号

    箭头

    集合运算符

    集合

    导数运算符

    导数

    特殊字体

    字体

    希腊字母

    希腊字母-01
    希腊字母-02
    参考:HTTP

    展开全文
  • Win下有Matlab,虽然Linux下也有,不过...Linux下有免费的软件,名字叫R,直接安装Fedora,进入terminal yum install R 然后进入窗口界面,输入R --gui=Tk 下面是老外给的3个gui建议,后面是我个人的建议。
  • 该项目,我对输入函数的一阶导数实施牛顿方法,以识别输入函数的潜在最小和最大值。 牛顿法由下面的函数递归定义。 梯度下降 当二阶导数为正数时,牛顿法效果很好,但是当二阶导数为负数时,牛顿法有时无法...
  • 收集和理解高中数学中的各种常见的模型,对理解高中数学内容会有很大的帮助。现举例如下: 一、求参数的取值范围模型【求谁则谁是参数】 A、函数型恒成立 ①一元一次型,变换主元法 如引例1、\(f(a)=(x-2)a+(x^2-...
  • size():获取矩阵的行数和列数 (1)s=size(A),...(3)size(A,n)如果size函数的输入参数再添加一项n,并用1或2为n赋值,则 size将返回矩阵的行数或列数。其中r=size(A,1)该语句返回的是矩阵A的行数, c=size(...
  • 本节书摘来自华章计算机《数学建模:基于R》一书的第1章,第1.1节,作者:薛 毅 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.1 数据的描述性分析 建立随机模型之前,首先要分析数据的主要特征,也...
  • 这项工作,我们开发了一个分区生物数学模型,以研究治疗对感染移民的人群控制疟疾的效果。 尤其是,传染病宿主种群模型由11个变量组成,为此提供了图形轮廓来描述其随时间的个体变化。 这可以借助MathCAD软件来...
  • Jupyter安装R内核

    千次阅读 2019-05-08 15:27:40
    Jupyter Notebook 的本质是一个 Web 应用程序,便于创建和共享文学化程序文档,支持实时代码,数学方程,可视化和 markdown。 用途包括:数据清理和转换,数值模拟,统计建模,机器学习等等。 Jupyter Notebook集合...
  • 主要是机器学习过程使用到的一些公式 one note 使用“Alt”+“=”即可键入公式 Microsoft公式 符号 对应于LATEX不同的公式 \doubleR ℝ \mathbb{R} \scriptl ...
  • 在R语言的绘图函数,如果文本参数是合法的R语言表达式,那么这个表达式就被用Tex类似的规则进行文本格式化。y (x) (exp(-(x^2)/2))/sqrt(2*pi)plot(y, -5, 5, main = expression(f(x) == frac(1,sqrt(2*pi))*e^(-...
  • R语言及Bioconductor基因组分析的应用》面向计算机应用人员,特别是针对从事数学统计分析和生物信息学研究及应用的有关人员,着重介绍R语言和Bioconductor的基本用法及技术,并提供许多精简的程序实例,为读者...
  • 2进制组合数学中的应用

    千次阅读 2009-08-19 15:59:00
    有一个字符串数组 r=[abc,bac,acb] 我只想保留其中一个组合,也就是说对于字符串内容相同,只是字符组合顺序不同的字符串进行删除。 我给大家介绍一个位运算的技巧,只限制于少于32个字母的情况。 假设字母a的asc码...
  • 因此使用R绘图时,如何我们目标图使用希腊字符、上标、下标及一些数学公式呢?本博客我们会进行详细的说明。 后面我们都将以一个最简单的绘图为例,只是将其标题进行修改。 希腊字母 使用希腊字符、...
  • 本节书摘来自华章计算机《数学建模:基于R》一书的第2章,第2.3节,作者:薛 毅 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 2.3 判别分析判别分析是用以判别个体所属群体的一种统计方法,它产生于20...
  • 数学之路(2)-数据分析-R基础(3)

    千次阅读 2013-04-18 11:59:18
    五、在R中创建的产生的这些单元为物件(对象集),这些物件可以是变量、数字数组、字符串、函数以及从这些组件产生的更多的结构。 objects()可用来显示存储在R中的对象集的名字 > objects() [1] "x" "xm" >...
  • 目前的工作提出了一种病媒传播的疾病模型,该模型考虑了使用分布延迟项的鹿群的迁徙影响。 该模型用于分析鹿迁移对高清传播的影响。 这分三个步骤进行。 首先,建立了地方病的存在和稳定性以及无病平衡的条件。...
  • 本节书摘来自华章计算机《数学建模:基于R》一书的第1章,第1.4节,作者:薛 毅 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.4 分布检验 本节要介绍的是另一类检验,其目标不是针对具体的参数,而是...
  • 区块链数学 - EdDSA签名机制

    千次阅读 2020-12-07 13:17:06
    Ed25519 使用了扭曲爱德华曲线,签名过程和之前介绍过的 Schnorr,secp...如果你对之前绍过的 Schnorr,secp256k1,sm2 等签名过程比较熟的的话,就容易理解如果签名过程出现了这个相同的随机数 r,那么私钥将很容易被
  • 其他存储库:有关动态借贷和储蓄问题,请参见和; 有关代码示例,请参见,,;。 有关Matlab的简介,请参见,有关R的介绍,请参见。 有关所有的公共存储库,请参见。 如有任何问题,请联系。 1个数组,矩阵,数据...
  • 数学中的内积和外积

    2021-01-06 21:41:11
    是指接受实数R上的两个向量并返回一个实数值标量的二元运算。它是欧几里得空间的标准内积。 两个向量和的点积定义为: 使用矩阵乘法并把(纵列)向量当作n×1 矩阵,点积还可以写为: 其中,指示矩阵a的转置。...
  • 离散数学中关于自反与反自反的通俗解释

    万次阅读 多人点赞 2017-06-15 23:47:57
    R是A上的二元关系,二元关系自反:任取一个A的元素x,如果都有&lt;x,x&gt;R,那么就说AR上是自反的 反自反:任取一个A的元素x,如果都有&lt;x,x&gt;不R,那么就说AR上是反自反的 ...
  • Quants 股票分析 这是 Excel、Power BI、Matlab、Python 和 R 语言的股票分析项目,具有不同类型的分析,例如数据分析、技术分析、基本面分析、定量分析和不同类型的交易策略。 此外,这是用于交易和投资的定量...
  • 微分方程,对一个变量微分称为常微分方程,对多个变量微分称为偏微分方程。 劳伦兹(Lorenz)方程式是由大气方程简化而来的,方程式如下: 其中,a,b,c为特定参数,某些特定数值可以观察到一些现象。下面...
  • 概念:对于任何正整数n,其约数个数记为f(n),如果某个正整数n满足...信竞有如下应用: 求约数刚好等于n的最小的那个数 求区间里的最小反素数([1,n]) 求区间里的最小反素数([l,r]) 2和3其实也是有区别的,...
  • 陈景润是数学天才吗?

    千次阅读 2019-01-23 23:09:17
    回想过去,袁萌曾经去过陈景润在数学所的宿舍,距离中关村游泳池不远的中关村88楼1门一层的楼梯间(不到3平方米)的小屋子。 陈景润的这间“宿舍”里面只有一块床板搭起来的小床。床底下堆满了各类数学书籍,床板...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,595
精华内容 638
关键字:

在数学中r是