精华内容
下载资源
问答
  • python绘制质粒图谱

    2019-05-02 19:27:00
    绘制一个白色圆 DRAW.pieslice((80, 80, 420, 420), 0, 360, fill= ' white ' ) # 添加箭头 draw_arrow_tip(TET_END, 10, ' blue ' ) draw_arrow_tip(AMP_START, -10, ' orange ' ) draw_arrow_tip(ORI_START,...
    #Author:Alex.Zhang
    from PIL import Image, ImageDraw,ImageFont
    import math
    #创建一个图像
    PLASMID_LENGTH = 4361
    SIZE = (500, 500)
    CENTER = (250, 250)
    #‘RGB’表示该图像采用红绿蓝配色方案,元组size取值(500, 500)
    # 在RGB中,红色(255,0,0),绿色(0,255,0),蓝色(0,0,255)
    # white可以为(255,255,255)或者‘#ffffff’,黑色(0,0,0)或‘#000000’
    #表示图像的x和y的尺寸为多少像素,‘white’设置背景色为白色
    pBR322 = Image.new('RGB', SIZE, 'white')
    #激活绘图工具
    DRAW = ImageDraw.Draw(pBR322)
    #定义三个函数
    def get_angle(bp, length=PLASMID_LENGTH):
        """质粒碱基的位置转换为角度"""
        return bp * 360 / length
    
    
    def coord(angle, center, radius):
        """ 返回圆上点坐标 (x,y) 坐标说明: 例如point(100,100),是距左边框100像素,距顶部100像素的一个点 box(100,100,150,150),距顶部和左侧边框各100像素的50像素宽的一个方形框 """
        #角度转弧度
        rad = math.radians(angle)
        x = int(center[0] + math.cos(rad) * radius)
        y = int(center[1] + math.sin(rad) * radius)
        return x, y
    
    
    def draw_arrow_tip(start, direction, color):
        """根据起始的角度位置画一个三角形"""
        p1 = coord(start + direction, CENTER, 185)
        p2 = coord(start, CENTER, 160)
        p3 = coord(start, CENTER, 210)
        DRAW.polygon((p1, p2, p3), fill=color)
    #绘制质粒
    TET_START, TET_END = get_angle(88), get_angle(1276)
    AMP_START, AMP_END = get_angle(3293), get_angle(4153)
    ORI_START, ORI_END = get_angle(2519), get_angle(3133)
    
    
    BOX = (50, 50, 450, 450)
    #画一个灰色的圆
    DRAW.pieslice(BOX, 0, 360, fill='gray')
    #填充一个扇形,TET_START为起始角度, TET_END终止角度,0度角在时钟的3:00位置
    DRAW.pieslice(BOX, TET_START, TET_END, fill='blue')
    #绘制一个白色圆
    DRAW.pieslice((80, 80, 420, 420), 0, 360, fill='white')
    #添加箭头
    draw_arrow_tip(TET_END, 10, 'blue')
    draw_arrow_tip(AMP_START, -10, 'orange')
    draw_arrow_tip(ORI_START, -10, 'darkmagenta')
    #添加文本
    arial16 = ImageFont.truetype('arial.ttf',16)
    DRAW.text((150, 130), "ori", fill=(0, 0, 0),font=arial16)
    DRAW.text((340, 130), "amp", fill=(0, 0, 0),font=arial16)
    DRAW.text((300, 380), "tet", fill=(0, 0, 0),font=arial16)
    #pBR322.save('plasmid_pBR322.png')
    #pBR322.save('plasmid_pBR322.jpg')
    pBR322.save('plasmid_pBR322.tif')

     

    转载于:https://www.cnblogs.com/klausage/p/10803153.html

    展开全文
  • 创建音乐图谱是一个很有趣的练习,它包含了音频处理、机器学习和可视化技术。基本步骤如下所示:转换MP3文件为低比特率WAV文件。 从WAV元数据中提取统计特征。 找到这些特征的一个最佳子集,使得在这个特征空间中...

    在本文中,我们将探讨一种简洁的方式,以此来可视化你的MP3音乐收藏。此方法最终的结果将是一个映射你所有歌曲的正六边形网格地图,其中相似的音轨将处于相邻的位置。不同区域的颜色对应不同的音乐流派(例如:古典、嘻哈、重摇滚)。举个例子来说,下面是我所收藏音乐中三张专辑的映射图:Paganini的《Violin Caprices》、Eminem的《The Eminem Show》和Coldplay的《X&Y》。

    0?tp=webp&wxfrom=5

    为了让它更加有趣(在某些情况下更简单),我强加了一些限制。

    首先,解决方案应该不依赖于MP3文件中任何已有的ID3标签(例如,Arist,Genre),应该仅仅使用声音的统计特性来计算歌曲的相似性。无论如何,很多我的MP3文件标记都很糟糕,但我想使得该解决方案适用于任何音乐收藏文件,不管它们的元数据是多么糟糕。

    第二,不应使用其他外部信息来创建可视化图像,需要输入的仅仅是用户的MP3文件集。其实,通过利用一个已经被标记为特定流派的大型歌曲数据库,就能提高解决方案的有效性,但是为了简单起见,我想保持这个解决方案完全的独立性。最后,虽然数字音乐有很多种格式(MP3、WMA、M4A、OGG等),但为了使其简单化,这里我仅仅关注MP3文件。其实,本文开发的算法针对其他格式的音频也能很好地工作,只要这种格式的音频可以转换为WAV格式文件。

    创建音乐图谱是一个很有趣的练习,它包含了音频处理、机器学习和可视化技术。基本步骤如下所示:转换MP3文件为低比特率WAV文件。

    从WAV元数据中提取统计特征。

    找到这些特征的一个最佳子集,使得在这个特征空间中相邻的歌曲人耳听起来也相似。

    为了在一个XY二维平面上绘图,使用降维技术将特征向量映射到二维空间。

    生成一个由点组成的六角网格,然后使用最近邻技术将XY平面上的每一首歌曲映射六角网格上的一个点。

    回到原始的高维特征空间,将歌曲聚类到用户定义数量的群组中(k=10能够很好地实现可视化目的)。对于每个群组,找到最接近群组中心的歌曲。

    在六角网格上,使用不同的颜色对k个群组中心的那首歌曲着色。

    根据其他歌曲在XY屏幕上到每个群组中心的距离,对它们插入不同的颜色。下面,让我们共同看看其中一些步骤的详细信息。

    MP3文件转换成WAV格式

    将我们的音乐文件转换成WAV格式的主要优势是我们可以使用Python标准库中的“wave”模块很容易地读入数据,便于后面使用NumPy对数据进行操作。此外,我们还会以单声道10kHz的采样率对声音文件下采样,以使得提取统计特征的计算复杂度有所降低。为了处理转换和下采样,我使用了众所周知的MPG123,这是一个免费的命令行MP3播放器,在Python中可以很容易调用它。下面的代码对一个音乐文件夹进行递归搜索以找到所有的MP3文件,然后调用MPG123将它们转换为临时的10kHz WAV文件。然后,对这些WAV文件进行特征计算(下节中讨论)。

    import subprocessimport waveimport structimport numpyimport csvimport sysdef read_wav(wav_file):"""Returns two chunks of sound data from wave file."""w = wave.open(wav_file)n = 60 * 10000if w.getnframes() < n * 2:raise ValueError('Wave file too short')frames = w.readframes(n)wav_data1 = struct.unpack('%dh' % n, frames)frames = w.readframes(n)wav_data2 = struct.unpack('%dh' % n, frames)return wav_data1, wav_data2def compute_chunk_features(mp3_file):"""Return feature vectors for two chunks of an MP3 file."""# Extract MP3 file to a mono, 10kHz WAV filempg123_command = '..mpg123-1.12.3-x86-64mpg123.exe -w "%s" -r 10000 -m "%s"'out_file = 'temp.wav'cmd = mpg123_command % (out_file, mp3_file)temp = subprocess.call(cmd)# Read in chunks of data from WAV filewav_data1, wav_data2 = read_wav(out_file)# We'll cover how the features are computed in the next section!return features(wav_data1), features(wav_data2)# Main script starts here# =======================for path, dirs, files in os.walk('C:/Users/Christian/Music/'):for f in files:if not f.endswith('.mp3'):# Skip any non-MP3 filescontinuemp3_file = os.path.join(path, f)# Extract the track name (i.e. the file name) plus the names# of the two preceding directories. This will be useful# later for plotting.tail, track = os.path.split(mp3_file)tail, dir1 = os.path.split(tail)tail, dir2 = os.path.split(tail)# Compute features. feature_vec1 and feature_vec2 are lists of floating# point numbers representing the statistical features we have extracted# from the raw sound data.try:feature_vec1, feature_vec2 = compute_chunk_features(mp3_file)except:

    continue

    特征提取

    在Python中,一个单声道10kHz的波形文件表示为一个范围为-254到255的整数列表,每秒声音包含10000个整数。每个整数代表歌曲在对应时间点上的相对幅度。我们将分别从两首歌曲中分别提取一段时长60秒的片段,所以每个片段将由600000个整数表示。上面代码中的函数“read_wav”返回了这些整数列表。下面是从Eminem的《The Eminem Show》中一些歌曲中提取的10秒声音波形图:

    0?tp=webp&wxfrom=5

    为了对比,下面是Paganini的《Violin Caprices》中的一些片段波形图:

    0?tp=webp&wxfrom=5

    从上面两个图中可以看出,这些片段的波形结构差别很明显,但一般来看Eminem的歌曲波形图看起来都有些相似,《Violin Caprices》的歌曲也是这样。接下来,我们将从这些波形图中提取一些统计特征,这些特征将捕捉到歌曲之间的差异,然后通过这些歌曲听起来的相似性,我们使用机器学习技术将它们分组。

    我们将要提取的第一组特征集是波形的统计矩(均值、标准差、偏态和峰态)。除了对幅度进行这些计算,我们还将对递增平滑后的幅度进行计算来获取不同时间尺度的音乐特性。我使用了长度分别为1、10、100和1000个样点的平滑窗,当然可能其他的值也能取得很好的结果。分别利用上面所有大小的平滑窗对幅度进行相应计算。为了获取信号的短时变化量,我还计算了一阶差分幅度(平滑过的)的统计特性。上面的特征在时间域给出了一个相当全面的波形统计总结,但是计算一些频率域的特征也是有帮助的。像嘻哈这种重低音音乐在低频部分有更多的能量,而经典音乐在高频部分占有更多的比例。

    将这些特征放在一起,我们就得到了每首歌曲的42种不同特征。下面的Python代码从一系列幅度值计算了这些特征:

    def moments(x):mean = x.mean()std = x.var()**0.5skewness = ((x - mean)**3).mean() / std**3kurtosis = ((x - mean)**4).mean() / std**4return [mean, std, skewness, kurtosis]def fftfeatures(wavdata):f = numpy.fft.fft(wavdata)f = f[2:(f.size / 2 + 1)]f = abs(f)total_power = f.sum()f = numpy.array_split(f, 10)return [e.sum() / total_power for e in f]def features(x):x = numpy.array(x)f = []xs = xdiff = xs[1:] - xs[:-1]f.extend(moments(xs))f.extend(moments(diff))xs = x.reshape(-1, 10).mean(1)diff = xs[1:] - xs[:-1]f.extend(moments(xs))f.extend(moments(diff))xs = x.reshape(-1, 100).mean(1)diff = xs[1:] - xs[:-1]f.extend(moments(xs))f.extend(moments(diff))xs = x.reshape(-1, 1000).mean(1)diff = xs[1:] - xs[:-1]f.extend(moments(xs))f.extend(moments(diff))f.extend(fftfeatures(x))return f# f will be a list of 42 floating point features with the following# names:# amp1mean# amp1std# amp1skew# amp1kurt# amp1dmean# amp1dstd# amp1dskew# amp1dkurt# amp10mean# amp10std# amp10skew# amp10kurt# amp10dmean# amp10dstd# amp10dskew# amp10dkurt# amp100mean# amp100std# amp100skew# amp100kurt# amp100dmean# amp100dstd# amp100dskew# amp100dkurt# amp1000mean# amp1000std# amp1000skew# amp1000kurt# amp1000dmean# amp1000dstd# amp1000dskew# amp1000dkurt# power1# power2# power3# power4# power5# power6# power7# power8# power9

    # power10

    选择一个最优的特征子集

    我们已经计算了42种不同的特种,但是并不是所有特征都有助于判断两首歌曲听起来是否相同。下一步就是找到这些特征的一个最优子集,以便在这个减小的特征空间中两个特征向量之间的欧几里得距离能够很好地对应两首歌听起来的相似性。变量选择的过程是一个有监督的机器学习问题,所以我们需要一些训练数据集合,这些训练集能够引导算法找到最好的变量子集。我并非通过手动处理音乐集并标记哪些歌曲听起来相似来创建算法的训练集,而是使用了一个更简单的方法:从每首歌曲中提取两段时长为1分钟的样本,然后试图找到一个最能匹配同一首歌曲中的两个片段的算法。

    为了找到针对所有歌曲能够达到最好平均匹配度的特征集,我使用了一个遗传算法(在R语言的genalg包中)对42个变量中的每一个进行选取。下图显示了经过遗传算法的100次迭代,目标函数的改进情况(例如,一首歌的两个样本片段通过最近邻分类器来匹配到底有多么稳定)。

    0?tp=webp&wxfrom=5

    如果我们强制距离函数使用所有的42个特征,那么目标函数的值将变为275。而通过正确地使用遗传算法来选取特征变量,我们已经将目标函数(例如,错误率)减小到了90,这是一个非常重大的改进。最后选取的最优特征集包括:

    amp10mean amp10std amp10skew amp10dstd amp10dskew amp10dkurt amp100mean amp100std amp100dstd amp1000mean power2 power3 power4 power5 power6 power7 power8 power9在二维空间可视化数据我们最优的特征集使用了18个特征变量来比较歌曲的相似性,但是我们想最终在2维平面上可视化音乐集合,所以我们需要将这个18维的空间降到2维,以便于我们绘画。为了实现这个目的,我简单地使用了前两个主成分来作为X和Y坐标。当然,这会引入一些错误到可视化图中,可能会造成一些在18维空间中相近的歌曲在2维平面中却不再相近。不过,这些错误无可避免,但幸好它们不会将这种关系扭曲得太厉害—听起来相似的歌曲在2维平面上仍然会大致集聚在一起。

    将点映射到一个六角网格

    从主成分中生成的2D点在平面上不规则地分布。虽然这个不规则的分布描述了18维特征向量在2维平面上最“准确”的布置,但我还是想通过牺牲一些准确率来将它们映射到一个很酷的画面上,即一个有规律间隔的六角网格。通过以下操作实现:将xy平面的点嵌入到一个更大的六角网格点阵中。

    从六角形最外层的点开始,将最近的不规则间隔的主成分点分配给每个六角网格点。

    延伸2D平面的点,使它们完全填充六角网格,组成一个引人注目的图。

    0?tp=webp&wxfrom=5为图上色

    这个练习的一个主要目的是不对音乐集的内容做任何假设。这意味着我不想将预定义的颜色分配给特定的音乐流派。相反,我在18维空间中聚合特征向量以找到聚集听起来相似的音乐的容器,并将颜色分配给这些群组中心。结果是一个自适应着色算法,它会找出你所要求的尽可能多的细节(因为用户可以定义群组的数量,也即是颜色数量)。正如前面提到的,我发现使用k=10的群组数量往往会给出好的结果。

    最终输出为了娱乐,这里给出我音乐集中3668首歌曲的可视化图。全分辨率图片可以从这里获得。如果你放大图片,你将会看到算法工作的相当好:着色的区域对应着相同音乐流派的音轨,并且经常是相同的艺术家,正如我们希望的那样。

    0?tp=webp&wxfrom=5

    展开全文
  • 创建音乐图谱是一个很有趣的练习,它包含了音频处理、机器学习和可视化技术。基本步骤如下所示: 转换MP3文件为低比特率WAV文件。 从WAV元数据中提取统计特征。 找到这些特征的一个最佳子集,使得在...

    在本文中,我们将探讨一种简洁的方式,以此来可视化你的MP3音乐收藏。此方法最终的结果将是一个映射你所有歌曲的正六边形网格地图,其中相似的音轨将处于相邻的位置。不同区域的颜色对应不同的音乐流派(例如:古典、嘻哈、重摇滚)。举个例子来说,下面是我所收藏音乐中三张专辑的映射图:Paganini的《Violin Caprices》、Eminem的《The Eminem Show》和Coldplay的《X&Y》。


    0?tp=webp&wxfrom=5

    为了让它更加有趣(在某些情况下更简单),我强加了一些限制。


    首先,解决方案应该不依赖于MP3文件中任何已有的ID3标签(例如,Arist,Genre),应该仅仅使用声音的统计特性来计算歌曲的相似性。无论如何,很多我的MP3文件标记都很糟糕,但我想使得该解决方案适用于任何音乐收藏文件,不管它们的元数据是多么糟糕。


    第二,不应使用其他外部信息来创建可视化图像,需要输入的仅仅是用户的MP3文件集。其实,通过利用一个已经被标记为特定流派的大型歌曲数据库,就能提高解决方案的有效性,但是为了简单起见,我想保持这个解决方案完全的独立性。最后,虽然数字音乐有很多种格式(MP3、WMA、M4A、OGG等),但为了使其简单化,这里我仅仅关注MP3文件。其实,本文开发的算法针对其他格式的音频也能很好地工作,只要这种格式的音频可以转换为WAV格式文件。


    创建音乐图谱是一个很有趣的练习,它包含了音频处理、机器学习和可视化技术。基本步骤如下所示:


    • 转换MP3文件为低比特率WAV文件。

    • 从WAV元数据中提取统计特征。

    • 找到这些特征的一个最佳子集,使得在这个特征空间中相邻的歌曲人耳听起来也相似。

    • 为了在一个XY二维平面上绘图,使用降维技术将特征向量映射到二维空间。

    • 生成一个由点组成的六角网格,然后使用最近邻技术将XY平面上的每一首歌曲映射六角网格上的一个点。

    • 回到原始的高维特征空间,将歌曲聚类到用户定义数量的群组中(k=10能够很好地实现可视化目的)。对于每个群组,找到最接近群组中心的歌曲。

    • 在六角网格上,使用不同的颜色对k个群组中心的那首歌曲着色。

    • 根据其他歌曲在XY屏幕上到每个群组中心的距离,对它们插入不同的颜色。


      下面,让我们共同看看其中一些步骤的详细信息。


    MP3文件转换成WAV格式


    将我们的音乐文件转换成WAV格式的主要优势是我们可以使用Python标准库中的“wave”模块很容易地读入数据,便于后面使用NumPy对数据进行操作。此外,我们还会以单声道10kHz的采样率对声音文件下采样,以使得提取统计特征的计算复杂度有所降低。为了处理转换和下采样,我使用了众所周知的MPG123,这是一个免费的命令行MP3播放器,在Python中可以很容易调用它。下面的代码对一个音乐文件夹进行递归搜索以找到所有的MP3文件,然后调用MPG123将它们转换为临时的10kHz WAV文件。然后,对这些WAV文件进行特征计算(下节中讨论)。


    import subprocess

    import wave
    import struct
    import numpy
    import csv
    import sys

    def read_wav(wav_file):
    """Returns two chunks of sound data from wave file."""
    w = wave.open(wav_file)
    n = 60 * 10000
    if w.getnframes() < n * 2:
    raise ValueError('Wave file too short')
    frames = w.readframes(n)
    wav_data1 = struct.unpack('%dh' % n, frames)
    frames = w.readframes(n)
    wav_data2 = struct.unpack('%dh' % n, frames)
    return wav_data1, wav_data2

    def compute_chunk_features(mp3_file):
    """Return feature vectors for two chunks of an MP3 file."""
    # Extract MP3 file to a mono, 10kHz WAV file
    mpg123_command = '..mpg123-1.12.3-x86-64mpg123.exe -w "%s" -r 10000 -m "%s"'
    out_file = 'temp.wav'
    cmd = mpg123_command % (out_file, mp3_file)
    temp = subprocess.call(cmd)
    # Read in chunks of data from WAV file
    wav_data1, wav_data2 = read_wav(out_file)
    # We'll cover how the features are computed in the next section!
    return features(wav_data1), features(wav_data2)

    # Main script starts here
    # =======================

    for path, dirs, files in os.walk('C:/Users/Christian/Music/'):
    for f in files:
    if not f.endswith('.mp3'):
    # Skip any non-MP3 files
    continue
    mp3_file = os.path.join(path, f)
    # Extract the track name (i.e. the file name) plus the names
    # of the two preceding directories. This will be useful
    # later for plotting.
    tail, track = os.path.split(mp3_file)
    tail, dir1 = os.path.split(tail)
    tail, dir2 = os.path.split(tail)
    # Compute features. feature_vec1 and feature_vec2 are lists of floating
    # point numbers representing the statistical features we have extracted
    # from the raw sound data.
    try:
    feature_vec1, feature_vec2 = compute_chunk_features(mp3_file)
    except:

    continue


    特征提取


    在Python中,一个单声道10kHz的波形文件表示为一个范围为-254到255的整数列表,每秒声音包含10000个整数。每个整数代表歌曲在对应时间点上的相对幅度。我们将分别从两首歌曲中分别提取一段时长60秒的片段,所以每个片段将由600000个整数表示。上面代码中的函数“read_wav”返回了这些整数列表。下面是从Eminem的《The Eminem Show》中一些歌曲中提取的10秒声音波形图:


    0?tp=webp&wxfrom=5


    为了对比,下面是Paganini的《Violin Caprices》中的一些片段波形图:


    0?tp=webp&wxfrom=5


    从上面两个图中可以看出,这些片段的波形结构差别很明显,但一般来看Eminem的歌曲波形图看起来都有些相似,《Violin Caprices》的歌曲也是这样。接下来,我们将从这些波形图中提取一些统计特征,这些特征将捕捉到歌曲之间的差异,然后通过这些歌曲听起来的相似性,我们使用机器学习技术将它们分组。


    我们将要提取的第一组特征集是波形的统计矩(均值、标准差、偏态和峰态)。除了对幅度进行这些计算,我们还将对递增平滑后的幅度进行计算来获取不同时间尺度的音乐特性。我使用了长度分别为1、10、100和1000个样点的平滑窗,当然可能其他的值也能取得很好的结果。

    分别利用上面所有大小的平滑窗对幅度进行相应计算。为了获取信号的短时变化量,我还计算了一阶差分幅度(平滑过的)的统计特性。

    上面的特征在时间域给出了一个相当全面的波形统计总结,但是计算一些频率域的特征也是有帮助的。像嘻哈这种重低音音乐在低频部分有更多的能量,而经典音乐在高频部分占有更多的比例。

    将这些特征放在一起,我们就得到了每首歌曲的42种不同特征。下面的Python代码从一系列幅度值计算了这些特征:


    def moments(x):

    mean = x.mean()
    std = x.var()**0.5
    skewness = ((x - mean)**3).mean() / std**3
    kurtosis = ((x - mean)**4).mean() / std**4
    return [mean, std, skewness, kurtosis]

    def fftfeatures(wavdata):
    f = numpy.fft.fft(wavdata)
    f = f[2:(f.size / 2 + 1)]
    f = abs(f)
    total_power = f.sum()
    f = numpy.array_split(f, 10)
    return [e.sum() / total_power for e in f]

    def features(x):
    x = numpy.array(x)
    f = []

    xs = x
    diff = xs[1:] - xs[:-1]
    f.extend(moments(xs))
    f.extend(moments(diff))

    xs = x.reshape(-1, 10).mean(1)
    diff = xs[1:] - xs[:-1]
    f.extend(moments(xs))
    f.extend(moments(diff))

    xs = x.reshape(-1, 100).mean(1)
    diff = xs[1:] - xs[:-1]
    f.extend(moments(xs))
    f.extend(moments(diff))

    xs = x.reshape(-1, 1000).mean(1)
    diff = xs[1:] - xs[:-1]
    f.extend(moments(xs))
    f.extend(moments(diff))

    f.extend(fftfeatures(x))
    return f

    # f will be a list of 42 floating point features with the following
    # names:

    # amp1mean
    # amp1std
    # amp1skew
    # amp1kurt
    # amp1dmean
    # amp1dstd
    # amp1dskew
    # amp1dkurt
    # amp10mean
    # amp10std
    # amp10skew
    # amp10kurt
    # amp10dmean
    # amp10dstd
    # amp10dskew
    # amp10dkurt
    # amp100mean
    # amp100std
    # amp100skew
    # amp100kurt
    # amp100dmean
    # amp100dstd
    # amp100dskew
    # amp100dkurt
    # amp1000mean
    # amp1000std
    # amp1000skew
    # amp1000kurt
    # amp1000dmean
    # amp1000dstd
    # amp1000dskew
    # amp1000dkurt
    # power1
    # power2
    # power3
    # power4
    # power5
    # power6
    # power7
    # power8
    # power9

    # power10


    选择一个最优的特征子集


    我们已经计算了42种不同的特种,但是并不是所有特征都有助于判断两首歌曲听起来是否相同。下一步就是找到这些特征的一个最优子集,以便在这个减小的特征空间中两个特征向量之间的欧几里得距离能够很好地对应两首歌听起来的相似性。

    变量选择的过程是一个有监督的机器学习问题,所以我们需要一些训练数据集合,这些训练集能够引导算法找到最好的变量子集。我并非通过手动处理音乐集并标记哪些歌曲听起来相似来创建算法的训练集,而是使用了一个更简单的方法:从每首歌曲中提取两段时长为1分钟的样本,然后试图找到一个最能匹配同一首歌曲中的两个片段的算法。

    为了找到针对所有歌曲能够达到最好平均匹配度的特征集,我使用了一个遗传算法(在R语言的genalg包中)对42个变量中的每一个进行选取。下图显示了经过遗传算法的100次迭代,目标函数的改进情况(例如,一首歌的两个样本片段通过最近邻分类器来匹配到底有多么稳定)。


    0?tp=webp&wxfrom=5

    如果我们强制距离函数使用所有的42个特征,那么目标函数的值将变为275。而通过正确地使用遗传算法来选取特征变量,我们已经将目标函数(例如,错误率)减小到了90,这是一个非常重大的改进。最后选取的最优特征集包括:


       amp10mean
       amp10std
       amp10skew
       amp10dstd
       amp10dskew
       amp10dkurt
       amp100mean
       amp100std
       amp100dstd
       amp1000mean
       power2
       power3
       power4
       power5
       power6
       power7
       power8
       power9

    在二维空间可视化数据

    我们最优的特征集使用了18个特征变量来比较歌曲的相似性,但是我们想最终在2维平面上可视化音乐集合,所以我们需要将这个18维的空间降到2维,以便于我们绘画。为了实现这个目的,我简单地使用了前两个主成分来作为X和Y坐标。当然,这会引入一些错误到可视化图中,可能会造成一些在18维空间中相近的歌曲在2维平面中却不再相近。不过,这些错误无可避免,但幸好它们不会将这种关系扭曲得太厉害—听起来相似的歌曲在2维平面上仍然会大致集聚在一起。


    将点映射到一个六角网格


    从主成分中生成的2D点在平面上不规则地分布。虽然这个不规则的分布描述了18维特征向量在2维平面上最“准确”的布置,但我还是想通过牺牲一些准确率来将它们映射到一个很酷的画面上,即一个有规律间隔的六角网格。通过以下操作实现:


    • 将xy平面的点嵌入到一个更大的六角网格点阵中。

    • 从六角形最外层的点开始,将最近的不规则间隔的主成分点分配给每个六角网格点。

    • 延伸2D平面的点,使它们完全填充六角网格,组成一个引人注目的图。

    0?tp=webp&wxfrom=5
    为图上色

    这个练习的一个主要目的是不对音乐集的内容做任何假设。这意味着我不想将预定义的颜色分配给特定的音乐流派。相反,我在18维空间中聚合特征向量以找到聚集听起来相似的音乐的容器,并将颜色分配给这些群组中心。结果是一个自适应着色算法,它会找出你所要求的尽可能多的细节(因为用户可以定义群组的数量,也即是颜色数量)。正如前面提到的,我发现使用k=10的群组数量往往会给出好的结果。


    最终输出

    为了娱乐,这里给出我音乐集中3668首歌曲的可视化图。全分辨率图片可以从这里获得。如果你放大图片,你将会看到算法工作的相当好:着色的区域对应着相同音乐流派的音轨,并且经常是相同的艺术家,正如我们希望的那样。

    0?tp=webp&wxfrom=5










    本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1623315,如需转载请自行联系原作者
    展开全文
  • 在网上搜索python绘制该类图形,发现教程极少且很多教程语焉不详,因此尝试用python来写个程序得到此图。 思路 主要思路就是,默认XRD谱图绘制在一张大的图中,将各个卡片按照高度不同依次叠加在大图中 思路如图所示...

    背景


    在XRD的绘制中,常常需要把XRD图谱和对应的pdf卡片放在同一张图中堆叠,来显示各个特征峰的归属。一般情况下,使用origin绘制,叠加图层的方法可以得到这种图形,然而该方法仍然需要分别绘制XRD图和pdf卡片,然后进行一定的拖拽,拖拽过程中容易平移,不容易对齐。在网上搜索python绘制该类图形,发现教程极少且很多教程语焉不详,因此尝试用python来写个程序得到此图。

    思路


    主要思路就是,默认XRD谱图绘制在一张大的图中,将各个卡片按照高度不同依次叠加在大图中
    思路如图所示:

    在这里插入图片描述Fig.1. 绘制思路

    因此,只需要卡片2的bottom和xrd谱图的bottom重合,卡片1的bottom和卡片2的top重合,即可。同时需注意去掉两张卡片图形的各种横纵坐标和框线等。

    代码

    # -*- coding: utf-8 -*-
    """
    Created on Mon Dec  7 16:33:39 2020
    
    @author: fya
    """
    
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    
    
    x0value=locals()
    xvalue=locals()
    y0value=locals()
    yvalue=locals()
    for i in range(1,4):
            
        x0value['x'+str(i)]=pd.read_csv('F:/XRD总.csv',header=None,usecols=[2*i-2]) #x1-x3是三组横坐标,横坐标在第 1,3,5列
        xvalue['x'+str(i)]=np.array(x0value['x'+str(i)])
        
        y0value['y'+str(i)]=pd.read_csv('F:/XRD总.csv',header=None,usecols=[2*i-1])  #y1-y3是三组纵坐标,纵坐标在第 2,4,6列
        yvalue['y'+str(i)]=np.array(y0value['y'+str(i)])
       
        
    #绘图
        
    fig=plt.figure(figsize=(5.36,4.1025),dpi=600)  #画一个图层
    
    #XRD画在最大的图层中,卡片从最下面依次堆叠
    axes = fig.add_axes([0.1, 0.1, 0.8, 0.8],facecolor='none')  # left, bottom, width, height (range 0 to 1),大图,放XRD谱图
    axes1 = fig.add_axes([0.1, 0.3, 0.8, 0.2],facecolor='none')  #卡片1,上
    axes2 = fig.add_axes([0.1, 0.1, 0.8, 0.2],facecolor='none')  #卡片2,下,facecolor设为none,图层透明,防止上面的图层覆盖下面的
    
    
    markerline, stemlines, baseline=axes2.stem(x3,y3, markerfmt=' ', basefmt = '-', use_line_collection=True)
    plt.setp(stemlines, linewidth=2, color='dimgray') #最下面,用stem函数画茎图,y坐标向x垂线
    
    markerline, stemlines, baseline=axes1.stem(x2,y2, markerfmt=' ', basefmt = '-', use_line_collection=True)
    plt.setp(stemlines, linewidth=2, color='#ff9b93') #卡片1
    
    plot=axes.plot(x1, y1,'-', color='#2d6187',linewidth=1.5) #XRD谱图
    
    
    #各subplot分别设置
    
    plt.sca(axes2)  
    plt.xlim(10,90) #最下图坐标范围
    plt.ylim(0,100)
    plt.yticks([])
    plt.xticks([])
    #plt.hlines(0, 10, 90,colors = "dimgrey")
    frame = plt.gca() #读取当前图层
    frame.spines['top'].set_visible(False)  #上框线不显示
    frame.spines['bottom'].set_visible(False)
    plt.text(63,35,'XXXXXXX',fontdict={'family' : 'Arial', 'size'   : 10}) #pdf卡片号,添加文本即可,(63,35)为文本开始的横纵坐标(按照当前图层的x y)
    
    
    plt.sca(axes) #大图
    plt.xlim(10,90)
    plt.ylim(-400,1500) #可根据自己的图形自行调整,y的范围会影响谱图出现的位置,多试试找到最佳位置
    plt.ylabel('Intensity  (a.u.)',fontdict={'family' : 'Arial', 'size'   : 20})
    plt.xticks(fontproperties = 'Arial', size = 16) #X轴 字体设置
    plt.xlabel('2 Theta (degree)', fontdict={'family' : 'Arial', 'size'   : 20}) #X label 字体设置
    plt.yticks([])
    frame = plt.gca()
    frame.spines['bottom'].set_visible(True)
    
    
    plt.sca(axes1) #中间图设置 
    plt.xlim(10,90) #中间坐标范围
    plt.xticks([])  #只要图形,其他的如各种轴线,坐标,一概不要
    plt.yticks([]) 
    plt.hlines(0, 10, 90,colors = "#ff9b93") #y=0的水平横线,括号第一个数字为y,第二和第三个数字为x的起始点
    frame = plt.gca()
    frame.spines['bottom'].set_visible(False)
    frame.spines['top'].set_visible(False)
    plt.text(63,25,'JCPDS  No. XXXX',fontdict={'family' : 'Arial', 'size'   : 10}) #pdf卡片号,添加文本即可
    
    plt.show()
    fig.savefig('XRDpython.tif',dpi=600,format='tif',bbox_inches = 'tight') #bbox_inches 为tight时,可以确保输出图片完整
    
    print('Done!')
    
    
    展开全文
  • 本篇文章主要采用Python和Gephi构建中国知网某个领域的作者合作关系和主题词共现的知识图谱,重点阐述了一种可操作的关系图谱构建方法,可用于论文发表、课程或企业可视化展示等。其基本步骤如下:1.在中国知网搜索...
  • 前面作者讲解了很多知识图谱原理知识,包括知识图谱相关技术、Neo4j绘制关系图谱等,但仍缺少一个系统全面的实例。为了加深自己对知识图谱构建的认识,为后续创建贵州旅游知识图谱打下基础,作者深入学习了张宏伦...
  • 整理了一份 Python 学习知识图谱

    万次阅读 2019-05-20 17:14:28
    做公众号以来和很多初学 Python 的粉丝交流过,发现不少人遇到的困惑主要集中在下面这 3类:1、「基础不牢」类型:最近在自学数据分析,发现自己的 Python 基础太...
  • author:weizhendongdata:2019.12.19func:绘制三国演义人物关系图"""import codecsimport jieba.posseg as psegimport xlwtdef excel_write(names,workbook):# 创建一个worksheetworksheet = workbook.add_sheet('...
  • 知识图谱—利用python进行知识入库 知识图谱—利用python进行知识入库 作为一个写sql出生的菜鸡,在这里分享一下去年11月到12月之间研究的关于知识图谱的课题相关知识,由于客户的原因最终该项目没有继续进行下去,...
  • 编译 | Arno来源 | github【磐创AI导读】:本系列文章为大家介绍了如何使用特定领域的文档构建知识图谱。想要获取更多的机器学习、深度学习资源,欢迎大家点击上方蓝字关注我们的公众号:磐创AI。在任何业务中,word...
  • 本系列文章主要结合Python语言实现知识图谱构建相关工程,具有一定创新性和实用性,非常希望各位博友交流讨论,相互促进成长。前面两篇文章详细讲解了哈工大Pyltp工具,包括中文分词、词性标注、实体识别、依存句法...
  • 本系列文章主要结合Python语言实现知识图谱构建相关工程,具有一定创新性和实用性,非常希望各位博友交流讨论,相互促进成长。第一篇文章主要介绍哈工大pytltp工具,包括安装过程、中文分词、词性标注和实体识别等。...
  • 本系列文章主要结合Python语言实现知识图谱构建相关工程,具有一定创新性和实用性,非常希望各位博友交流讨论,相互促进成长。第一篇文章主要介绍哈工大pytltp工具,包括安装过程、中文分词等;第二篇文章主要讲解...
  • Python先处理csv文件数据,在自动化批量在neo4j生成节点。 from py2neo import Node, Relationship, Graph import re # 数据库连接 graph = Graph('http://localhost:7474/', username='neo4j', password='****') ...
  • author:weizhendongdata:2019.12.19func:绘制三国演义人物关系图"""import codecsimport jieba.posseg as psegimport xlwtdef excel_write(names,workbook):# 创建一个worksheetworksheet = workbook.add_sheet('...
  • 1. 创建一个图 import networkx as nx g = nx.Graph() g.clear() #将图上元素清空 所有的构建... 本文标题: python networkx 包绘制复杂网络关系图的实现 本文地址: http://www.cppcns.com/jiaoben/python/265136.html
  • 前面作者讲解了很多知识图谱相关的原理知识,包括知识图谱相关技术、Neo4j绘制关系图谱等,但还是缺少一个系统全面的实例。为了加深自己对知识图谱构建的认识,为后续创建贵州旅游知识图谱打下基础,作者学习了张...
  • 颜色图谱 具体颜色描述 autumn 红橙黄 cool 青-洋红 copper 黑-铜 flag 红-白-蓝-黑 gray 黑-白 hot 黑-红-黄-白 hsv hsv颜色空间, 红-黄-绿-青-蓝-洋红-红 inferno 黑-红-黄 jet 蓝-青-黄-红 magma 黑-红-白 pink ...
  • 知识图谱绘制

    千次阅读 2018-10-19 22:39:00
    今天抽出晚上时间专门查了一下知识图谱绘制。大致就是类似下面这种图 其实研二时候找nature的论文就遇到过这种图,博一时候又在弄R的时候学了一下。但是放了一段时间又忘记了。主要还是在于得自己用到论文...
  • 本篇文章主要采用Python和Gephi构建中国知网某个领域的作者合作关系和主题词共现的知识图谱,重点阐述了一种可操作的关系图谱构建方法,可用于论文发表、课程或企业可视化展示等。其基本步骤如下: 1.在中国知网...
  • Python绘制漫天的雪花,漫步天涯

    千次阅读 2020-08-12 20:30:54
    Python绘制下雪图

空空如也

空空如也

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

python绘制知识图谱

python 订阅