データの効率的な圧縮方法とは?

このQ&Aのポイント
  • データの効率的な圧縮方法を探しています。現在、1000bitのデータを効率的に圧縮する方法を考えていますが、1となるビットが多い場合や元のデータが少ない場合にはあまり効果がありません。より効率的な圧縮方法や他の方法があれば教えてください。
  • 1000bitのデータを効率的に圧縮する方法を探しています。現在、2bit目、5bit目、12bit目、21bit目、23bit目、25bit目、50bit目、200bit目が1で、それ以外が0であるデータを圧縮しようと考えています。しかし、1となるビットが多い場合や元のデータが少ない場合には効果がありません。より効率的な圧縮方法や他の方法があれば教えてください。
  • データの効率的な圧縮方法を探しています。現在、1000bitのデータを圧縮するために、2bit目、5bit目、12bit目、21bit目、23bit目、25bit目、50bit目、200bit目が1で、それ以外が0である形式に変換し、それを横に並べて圧縮しようと考えています。しかし、1となるビットが多い場合や元のデータが少ない場合にはあまり効果がありません。他のより効率的な圧縮方法があれば教えてください。
回答を見る
  • ベストアンサー

次のデータを効率的に圧縮したい

次のデータを効率的に圧縮したい いま、1000bitのデータが与えられていて、その内どこが1でどこが0か分かっている。 例えば、2bit目、5bit目、12bit目、21bit目、23bit目、25bit目、50bit目、200bit目が1で、 それ以外が0であるとわかっている。 このようなデータを効率的に可逆圧縮したいと考えています。 いま考えている方法として、 2bit目、5bit目、12bit目、21bit目、23bit目、25bit目、50bit目、200bit目が1なので、 横に並べて、251221232550200。 251221232550200  ↓(下表に従う) 001 1110 1000 1110 000001 1110 001000 1110 001010 1110 0011000 1110 10001101 1110 00111011101 こうして、1000bitが79bitに圧縮でき、復元も可能です。 しかし、問題は、  ☆1となるビットが多い場合、全然圧縮できないということ。  ☆元のデータが50bitくらいだと、あまり圧縮できない。 ということです。 もっと効率的な圧縮の方法や他に良い方法はないでしょうか? 知恵をお貸し下さい。 よろしくお願いします。 ――― 表 ――――――――― 1 ⇔ 000 2 ⇔ 001 3 ⇔ 010 4 ⇔ 011 5 ⇔ 1000 6 ⇔ 1010 7 ⇔ 1001 8 ⇔ 1011 9 ⇔ 1100 0 ⇔ 1101 & ⇔ 1110 (&は区切り文字) ――――――――――――――

  • nnsvm
  • お礼率16% (39/239)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

ほとんどが 0 って事であれば、No2 さんのおっしゃるように 0 の続く個数を エンコードするのがよいかと思います。 自分だったら、次のどちらかですかね。 0~7: 1XXX 8~39: 01XXXXX 40~167: 001XXXXXXX 168~679: 0001XXXXXXXXX 以下同様に、0 が一つ増えたら、その後の桁が 2 つ増える 0~3: 1XX 4~19: 01XXXX 20~83: 001XXXXXX 84~339: 0001XXXXXXXX 以下同様に、0 が一つ増えたら、その後の桁が 2 つ増える 先ほどのデータだと、No2 さんのように、1,2,6,8,1,1,24,149 を圧縮すればいいので 上だと 1-001 1-010 1-110 01-00000 1-001 1-001 01-10000 001-1101101 で、34bit 下だと、 1-01 1-10 01-0010 01-0100 1-01 1-01 001-000100 0001-01000001 で、33bit になります。 1となるビットが多い場合があるんだったら、下の方がいいでしょうね。 下の方だったら全体の 1/4 ぐらいまでだったらなんとか圧縮できそうです。 結局は、No1 さんのおっしゃるように、元データの特性に合わせて、 圧縮する方式を考えるのが一番という事になるかとは思います。

nnsvm
質問者

補足

ご回答ありがとうございます。 30bit前後に圧縮できるなら十分利用できそうですね。 とても参考になりました。ありがとうございます。 また、別の方法として、以下の記事のフィボナッチ数列を利用した符号化は どうかと考えています。 (フィボナッチ数の性質で「すべての自然数は、隣接しないフィボナッチ数の 和の形で一意的にかける」というのがあるそうなので。) フィボナッチ符号 http://ameblo.jp/316228/entry-10476109850.html つまり、 2bit目、5bit目、12bit目、21bit目、23bit目、25bit目、50bit目、200bit目が1 ⇒1,2,6,8,1,1,24,149 ⇒12681124149(これをフィボナッチ符号で表す)  ※フィボナッチ数列はあらかじめ表として作っておく しかし、フィボナッチ符号で表せても、数字の区切りをどう表したらよいかで悩んでいます。 また、桁数が大きすぎてオーバーフローするのではというのも問題です。 この方法で補足頂けるアイデアがございましたらご教示ください。 よろしくお願いします。

その他の回答 (6)

  • Mr_Holland
  • ベストアンサー率56% (890/1576)
回答No.7

> 対象とするデータは、時間によって変化する時系列のデータで、ある時間帯では、 > 1 が多くなり、ある時間帯では、1 は数ビットのみとなるようなデータとなります。 > そのため、偏りが小さい平均的に圧縮率が大きい符号復号の方法を検討しています。  時間帯によってデータの特徴が大きく異なるのであれば 次の方法が考えられます。 (A) 最も長い時間現れるデータの特徴に適した圧縮方法をとる。 (B) データの特徴によって圧縮方法を適宜変更する。(圧縮方法はデータに符号化して付加する。)  また、これまでのところ時間帯別のデータを個別に圧縮することを考えておられるようですが、各ビットの時系列上の変化はどうなっているでしょうか。  もし各ビットでの変化が少ないようでしたら、1つ前の時間帯のデータに対して変化したビットだけfごうかするという方法もあります。  可能でしたら 実際のデータの例を出してみませんか?  ここの回答者さんたちでしたら そのほうがより的確なアドバイスが得られるように思いますよ。  いかがですか?

  • alice_44
  • ベストアンサー率44% (2109/4759)
回答No.6

> どんな符号化が効率的かは、 > どんなデータが、どんな頻度で現れるか次第です。 と書きましたが、御理解いただけなかったよですね。 > ある時間帯では、1 が多くなり、ある時間帯では、1 は数ビットのみとなるようなデータ ・ 1 が多い時間帯での 1 の多さは、最大どのくらいか。 ・ 1 が多い時間帯と 0 が多い時間帯は、それぞれどのくらいの長さ続くのか。 ・ 1 が多い時間帯と 0 が多い時間帯の、切り替わり方に何かパターンは無いか。 などなど… もう少し具体化してゆかないと、何が効率的かは検討できません。 可逆符号による圧縮とは、要するに、予測しやすいデータに短い符号を割り当てる ということなんですから。

  • alice_44
  • ベストアンサー率44% (2109/4759)
回答No.5

No.1 には、応答を頂けなかったようです。 書いておいたのですが、可逆圧縮で どんな符号化が効率的かは、 どんなデータが、どんな頻度で現れるか次第です。 そこの補足がないとね。 0 の多いデータを想定した回答がありますが、 質問には、1 が多くなると圧縮率が落ちる ことに悩んでいる件りがあるし… 実のところ、質問氏は何がしたいんでしょう?

nnsvm
質問者

補足

>どんな符号化が効率的かは、どんなデータが、どんな頻度で現れるか次第です。  対象とするデータは、時間によって変化する時系列のデータで、ある時間帯では、  1 が多くなり、ある時間帯では、1 は数ビットのみとなるようなデータとなります。  そのため、偏りが小さい平均的に圧縮率が大きい符号復号の方法を検討しています。  そのような方法が難しいのは重々承知していますが、それでも何かよい方法がないか  と考えている次第です。

回答No.4

フィボナッチ符号の符号化の仕方は、数字の区切り方も含めて、 いただいた HP にありますので、詳しくはそちらを参照して いただくとして。 フィボナッチ符号は、符号化が面倒なうえ、バイトの使用効率が よくないです。 理想的な圧縮列は、0 と 1 がほぼ半々になりますが、 フィボナッチ符号は 0 が多いため、情報に偏りがあります。 ちなみに、先ほどの数列だと 50bit になりました。 って、さすがにそこまで差がつかないだろうと思ってみてみたら、 さっきの書き込みで、自分の圧縮列のビット数を数え間違えてますね、、、 さすがに、そこまで差はつきませんよね。 ちなみに、44bit と 45bit ですね。

nnsvm
質問者

補足

フィボナッチ符号は符号復号の計算時間、圧縮率からしてもあまりよくないですね。 また別の方法も考えてみます。

  • Mr_Holland
  • ベストアンサー率56% (890/1576)
回答No.2

 扱うデータの特徴によりけりです。  ですので、小手先ですが質問者さんの方法を改善する案を提示します。 【改善案】「1」のあるビット目をそのまま10進数で並べていますが、次の「1」までの「0」の個数を並べます。    この方が10進数の数値を小さくさせられるため 2進数に暗号化したときビット長は短くなります。    質問者さんが提示されたデータの場合 次のようになります。 >   2bit目、5bit目、12bit目、21bit目、23bit目、25bit目、50bit目、200bit目が1    ⇒1,2,6,8,1,1,24,149    ⇒000 1110 001 1110 1010 1110 1011 1110 000 1110 000 1110 001011 1110 0010111100 (64ビット)   利点:「1」の個数が増えるほど次の「1」までの「0」の個数は減少し、10進数の数値が小さくなるため 暗号化の効率が向上します。

nnsvm
質問者

補足

ご回答ありがとうございます。 次の「1」までの「0」の個数を並べる符号法もありですね。 新たにできないかと思う方法として、以下の記事のフィボナッチ数列を 利用した符号化はどうかと考えています。 (フィボナッチ数の性質で「すべての自然数は、隣接しないフィボナッチ数の 和の形で一意的にかける」というのがあるそうなので。) フィボナッチ符号 http://ameblo.jp/316228/entry-10476109850.html つまり、 2bit目、5bit目、12bit目、21bit目、23bit目、25bit目、50bit目、200bit目が1 ⇒1,2,6,8,1,1,24,149 ⇒12681124149(これをフィボナッチ符号で表す)  ※フィボナッチ数列はあらかじめ表として作っておく しかし、フィボナッチ符号で表せても、数字の区切りをどう表したらよいかで悩んでいます。 また、桁数が大きすぎてオーバーフローするのではというのも問題です。 この方法で補足頂けるアイデアがございましたらご教示ください。 よろしくお願いします。

  • alice_44
  • ベストアンサー率44% (2109/4759)
回答No.1

可逆圧縮では、全ての場合にデータを小さくすることはできません。 全ての場合にデータが小さくなったら、それは情報量が減っている ということですから、もと通りに復元できない場合が生じてしまいます。 ある場合にはデータが圧縮され、別の場合にはデーターが膨張するのが、 可逆圧縮の特徴です。 生データが表現し得る全てのデータを考えるのではなく、 出現頻度が高いデータに対して圧縮率が高くなるように、 圧縮方法をデザインしておくのです。 どんなデータの頻度が高いか、考察することから設計が始まります。

関連するQ&A

  • 圧縮された画像データの復元って?

    Photoshopで、 (1):Tiff画像データをJpeg画像データに変換すると、非可逆圧縮され、データ量が小さくなりますが(当たり前ですね、、、) さらに、(2):一度圧縮保存した同じ画像を再度読み出して、Tiffに再変換しすると、(1)と同じデータ量を示します。 これって、どういうことになっているのでしょうか? 非可逆とは、字のごとく、元に戻らない(もしくは一部は元に戻らない)、という意味ではないのでしょうか? 想像するに、(2)のデータは非可逆圧縮(一部のデータを廃棄)されているので、(1)と全く同じではない、と考えるのですが、Jpeg圧縮前と同データ容量としてTiff化されるので、不思議です? この内実は、非可逆圧縮時に廃棄されたデータが再変換される時に、実態のない架空水増しデータが作成されて、データ容量としてのみ、それを補っているということなのでしょう? また、Jpeg変換時の圧縮率(=廃棄率?)にもよるのでしょうが、Tiff⇒Jpeg⇒Tiffに再変換した時、どの程度のデータなら廃棄されずに復元されるのでしょうか? この場合のJpegデータは、レタッチ処理やJpeg上書き保存を一度もしていないものとして。 いかがでしょうか?ご教示ください。

  • ニコンの記録方式(RAW圧縮とビット数について)

    銀塩カメラを使っていたのですが、デジタルも使いたいと思っているものです。デジタルは初めてなので少し情報を集めていて疑問に思った点を質問します。ニコンのD300がいいかなあと思って調べました。 どうぞよろしくお願いします。 記録方式についてなのですが、「RAW画像の圧縮方式」は三つあるようでした。 (1)ロスレス圧縮RAW((3)に対して60-80%のサイズ、可逆圧縮) (2)圧縮RAW((3)に対して45-60%のサイズ、不可逆圧縮) (3)非圧縮RAW ここで疑問なのですが、(1)と(3)の差についてです。 (1)の補足として「データを完全に復元できる。記録した画像は(3)と同等の画質になる」とありました。これは、画質が(1)と(3)では変わらないということを意味するのでしょうか。もしそうだとすると、画質が変わらず記録サイズが小さくなる(1)で記録した方がどう考えてもいいということにならないのでしょうか。そうであるなら、そもそも(3)の存在意義とはなんなのでしょうか。 よければ実際に皆さんがどのような状況に合わせてRAWの記録方式を採用していっているのか(jpegはおいておくとして)についても教えていただけませんでしょうか。 それからもうひとつ、「RAW画像の記録ビット数」についてです。 12bitと14bitが選択できるようで、これは14bitの方がが記録サイズが大きくてその分だけ12bitより画質がよいということらしいのですが、それ以外の点における違いはあるのでしょうか。また実際に記録するときこのbit数を変える状況というのはどのような場合に起こるものなのでしょう。(普通、記録サイズを小さくしたいというのであれば、jpegにするのが一般的らしいとききましたが、bitをいじるだけの理由というのはどのような状況で生じるのでしょうか)

  • 可逆圧縮の音声データ形式について

    最初にFLACやAPEなどの可逆圧縮のデータ形式で保存した場合、そのデータをWAVE形式に変換し直したとき、完全にデータをWAVE形式のときと同じように復元することができるのでしょうか? 回答よろしくお願いします。

  • データを圧縮したい

    0或いは1が512個連続するビットパターンがあります。 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 のようなのです。 これを eYLfJXkQiS6{m"mMtI;|l"dajI.| YBCy/`usySwXm7n95(ad#oj6m7K5A:kRY5SC.)4}EvHND5R8a まで圧縮できました。 もっと圧縮する方法はありますか? テキストファイル(データ)しばりでお願いします。 これぞという回答お待ちしています。

  • 可逆圧縮録画のビットレートとファイル容量の関係

    動画の非可逆圧縮と可逆圧縮についてです。 現在、4Kゲームをフルスクリーン録画するのに、ソフトはOBS Studioで録画設定をAMD Advanced Media Frameworkを使ってます。 可変ビットレート設定で、目標を40Mbps、最大を60Mbpsにしてます。 これで録画すると、30分で大体13GBになります。 もちろんビットレートを落とすと、それに応じて容量も下がります。 で、興味本位で4Kを可逆圧縮で録画したく、OBSの録画設定を 添付写真にしました。magicyuvは可逆圧縮コーデックです。 UtVideoとかLagarithとかと同じ部類です。 写真の設定の中で、映像ビットレートの部分を弄ってみようという魂胆なんですが、 私は映像ビットレートの数字を下げたら可逆圧縮後の容量ももちろん下がると踏んでいました。 40Mbps/15Mbps/1Mbps、この3種類くらいの数字でWatch Dogs Legionのベンチマーク(2分くらい)を録画したんですが、なんと40Mbpsと1Mbpsの容量がほぼ同じ26GBでした。プロパティのビットレートを確認すると、設定ビットレートとカッチリ一致していました。 「なんやと!?」と思って、他の録画ソフトBandicamでコーデックをmagicyuvにして録画(Bandicamでは形式をaviにした場合はビットレート指定ができない)したところ、今度は22GBになりました。 しかし、プロパティでビットレートを見ると160Mbpsと一番大きかったです。(写真下部のファイル一覧下から3つ目) ただし、録画データを再生しても、可逆なので目視でわかるような画質変化はありません。データ的にも劣化などはしていないはずですが… やったことをまとめると OBS Studioでの録画ビットレート設定と容量 40Mbps/15Mbps/1Mbps → 26GB Bandicamでの録画と容量 160Mbps → 22GB です。ビットレートとその容量が比例しておりません。非可逆と可逆でビットレートの扱いが違うんでしょうか?私は何か勘違いをしているのでしょうか? そもそもOBSではビットレート指定ができても、Bandicamではビットレート指定の項目がないので、不思議には思っていました。 録画環境は Windows 10 Pro Ryzen 9 5950X+RX6900XT メモリ32GB 録画ドライブ:NVMe SSD 1TBです。 普段は非可逆h264で録画なので、興味で知りたいです。よろしくお願いします。

  • どう圧縮(エンコ)するのが一番良いですか?

    この度、とある動画を編集し圧縮しようと試みているのですが 圧縮、エンコードについて大まかな知識はあるのですが どのようなやり方が、一番画質を保てて尚且つ、サイズを小さく出来るのか がいまいち分かりません。 今迄はwmv(ウィンドウズメディア形式)で圧縮してたのですが サイズは少なく良いのですが、その分大分画質が下がってしまいます。 ちなみに動画のデータは以下のようになってます 真空波動研より 750x420 24Bit Windows Media Video 9 29.97fps 700.00kb/s Windows Media Audio 9.1 32.00kHz 16Bit 2ch 40.00kb/s 何卒、ご教示の程、宜しくお願い致します

  • 効率よくデータを移行するにはどうしたらいいでしょうか?

    効率よくデータを移行するにはどうしたらいいでしょうか? 内臓ハードディスクを渡され、メディアにすべて焼いてほしいと 言われて困っています。当初、何も考えずハードディスクの中にあるものを すべて放り込んで焼けばいいと思ったのですが、 中身を見てみると、24GBあり、そこではじめて複数のメディアに焼かなければいけない 事に気付きました。 メディアはDVD-Rです。 やはり選別して、焼いていくしかないのでしょうか? ひとまとめに圧縮し、分割して焼くという方法はありますか? WindowsVistaです。

  • WMA可逆圧縮から非可逆圧縮への一括変換方法

    現在、PCに取り込める音楽ファイル形式はいろいろありますが、非圧縮もしくは可逆圧縮で無い限りデータの一部を捨てる事でファイルサイズを減少させているため自宅PCへはWMAロスレス形式で保存を考えています。 しかし、最近のMP3オーディオなどではHDD容量の関係や非対応のために非可逆圧縮を選ばざるを得ない状態です。(まあ、雑音の多い屋外利用ではそれで問題は無いので良いのですが) そんな訳で、WMAロスレスで保存したライブラリを一括でWMA非可逆に、タグ情報を保持したまま変換する良い方法があったら教えてください。いろいろなサイトを見たのだけれど、判らなくて、、 よろしくお願いします。

  • 32bit 64bit メモリを効率的?

    32bit OSと64bit OSの違いについて 使用できるメモリの量が違う=メモリを効率的に利用できる でしょうか? それとも、 両者は、異なるのでしょうか?(同じメモリの量、32bitで利用できるメモリ量でも、64bitの方が処理が早い) 「32 ビット」と「64 ビット」という用語は、コンピューターのプロセッサ (CPU とも呼ばれます) が情報を処理する方法を指します。64 ビット バージョンの Windows は大容量のランダム アクセス メモリ (RAM) を、32 ビット システムに比べてより効率的に処理できます。

  • 圧縮したい!

    皆様の経験と知恵をお貸し下さい。 引越しにあたり収納スペースがとても狭くて困っています。 かなり処分しましたが、どうしても必要な衣類はどのように収納したら効率が良いでしょうか? 布団のように圧縮袋に入れてセーター等の冬物衣類(コート除く)を片付けようかと思いましたが、型崩れしそうで怖いし…。 何か良い方法がありましたら、教えて下さい。 宜しくお願い致します。