Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Неслучайная случайность, или рандомная последовательность в питоне.  (Прочитано 2538 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
А я не могу понять точно постановку задачи. (Как я понял - это биология?)
Можно к примеру рандомно генерировать A T G и C.
Все сливать в одну последовательность. Вопрос - считать только соседние
пары символов или все образуемые пары?
К примеру имеем ATGC
Будет по условию две пары AT и GC
или три AT, TG, GC ?


Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Да, я учусь применению питона для анализа биологических последовательностей.
Я так и делал, рандомно генерировал A, T, G и C, сливал в одну последовательность))

Это даст три пары, нет ограничений на их перекрывание.
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Попробовал учесть все соседние пары. Получил такой результат:
(Нажмите, чтобы показать/скрыть)

Сам код:
# -*- coding: utf-8 -*-
#!usr/bin/env python

from random import randrange

size = 160000

nuc = ('A', 'T', 'G', 'C')

sec = [] # сюда будем сливать ранндомно A T C G

sec2 = [] # здесь будут формироваться пары

let2 = ( ('A','A'),('A','T'),('A','G'),('A','C'), # кортеж возможных пар символов
         ('T','T'),('T','A'),('T','G'),('T','C'),
         ('G','G'),('G','A'),('G','T'),('G','C'),
         ('C','C'),('C','A'),('C','T'),('C','G') )

result =  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,] # здесь будет частота втречаемости пар

def createSec(): # создает sec размером size
    for i in range(size):
        n = randrange(4) # генерируем случайное число в дипазоне от 0 до 3
        ch = nuc[n]
        sec.append(ch)

def createSec2(): # создает sec2
    for i in range(size-1):
        head = sec[i]
        tail = sec[i+1]
        para = (head, tail)
        sec2.append(para)

def countPar(): # подсчитывает образованные пары
    for i in range(16):
        para = let2[i]
        result[i] = sec2.count(para)

def putLet2(): # выводит частоту втречаемости пар в %
    for i in range(16):
        n = result[i]
        x = n*100.0/size
        print let2[i], ' = ', x, " %"

def main():
    createSec()
    createSec2()
    countPar()
    qPar = len(sec2)
    print 'Количество образованных пар =', len(sec2)
    print 'result =  ', result
    putLet2()
   
main()


Интересно, полученный результат распределения в 6 %
как то подтверждается в биологии?
« Последнее редактирование: 26 Января 2013, 21:54:38 от Señor_Gaga »

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Удивительно, почему у меня не так получается?..
А 6% тут никакого смысла не несут, конечно, это просто равномерное распределение 100%/16 = 6,25 %.
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Однако задачка доставила...
Давай еще!  :)

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Удивительно, почему у меня не так получается?..

Вот это самая интересная для меня задачка! Делаю же по сути все ровно так же (даже красивее, на мой вкус ;-), но это каждому свое). Я в тупике, где у меня лажа?
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Пробовал твою запустить, на сразу споткнулся на этом:

from scipy.stats import chisquare

У меня такого модуля нет.

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Я уже говорил, это можно убрать, ничего не потеряв из нужного.
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Так что, нет идей, что я там не так сделал?
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Запустить программу не удалось. Выдает ошибки:
(Нажмите, чтобы показать/скрыть)

Так же возможно сбой в этой функции:
def get_word_dict(seq):
    word_dict = {}
    for length in range(1, 6):
        for word in words(seq, length):
            word_dict[word] = seq.count(word) #Сам подсчет
    return word_dict


seq.count(word) однозначно возвращает число вхождений
word в список seq. Зачем все это засовывать в цикл?

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Ну, неудивительно, что выдает ошибки. Просто уберите все, где упоминается этот злосчастный chisqare.

А цикл для внутренний для того, чтобы записать все вхождения слов длины length из внешнего цикла.
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Смысла не вижу. Я задачку уже решил.
А ваш код не понимаю, разбираться нет времени.
Протестируйте отдельно каждую функцию.
Возможно найдете где глюк.

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Эх. Это же не "Заточи свой мозг" тема, а как раз вопрос в том, что не так, если что-то не так) Так что смысл самый непосредственный...
Ubuntu 14.04 (Unity), MSI GE40

Оффлайн Phlya

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2219
  • Фля, Цыганский барон, Винни Пух
    • Просмотр профиля
Обнаружил, что string.count(substring) считает непересекающиеся последовательности.

Да, это, оказывается, и в документации написано:

Цитировать
str.count(sub[, start[, end]])

    Return the number of non-overlapping occurrences of substring sub in the range [start, end]. Optional arguments start and end are interpreted as in slice notation.

В общем, переделал подсчет вот так:
Код: (Python) [Выделить]
def get_word_dict(seq, length = range(1,5)):
    word_dict = {}
    for l in length:
        for word in get_words(l):
            word_dict[word] = 0
        start = [i for i in range(len(seq)-l+1)]
        for i in start:
            word = seq[i:i+l]
            word_dict[word] += 1
    return word_dict

Последовательность событий АА имеет меньшую вероятность чем последовательность АТ
В общем, не стоит умничать и утверждать что-то, если не знаете. Разумеется, вероятность одинаковая.
Ubuntu 14.04 (Unity), MSI GE40

 

Страница сгенерирована за 0.038 секунд. Запросов: 25.