質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

1046閲覧

Pythonクラスタリング方法について

barobaro

総合スコア1286

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/11/06 14:16

編集2021/11/07 13:20

前提・実現したいこと

イメージ説明

現在2種類のタイプの機器があり
上と下でグループ分けをしてそれぞれで単回帰分析をしたいのですが

まずクラスタリングでそれぞれの機器にグループ分けをしたいのですが
kmeansだときれいに分けることができません

グループ分けするよい手法があれば教えてください

発生している問題・エラーメッセージ

イメージ説明

該当のソースコード

python

1import pandas as pd 2 3url = "https://docs.google.com/spreadsheets/d/e/2PACX-1vSA9NhTNG6rcb1BAdVzC2RYgPPCCd0ryo1YconlDj7TK15IAO8rIi3uY9FzRCkXsj48BO4hWtceriKq/pub?gid=0&single=true&output=csv" 4 5df = pd.read_csv(url) 6 7sns.scatterplot(x='ta', y='m', data=df)

試したこと

KMeans

python

1df1 = df.copy() 2 3from sklearn.cluster import KMeans 4 5kmeans = KMeans(n_clusters=2, random_state=0) 6 7clusters = kmeans.fit(df1) 8df1['cluster'] = clusters.labels_ 9 10sns.scatterplot(x='ta', y='m', hue='cluster', data=df1)

イメージ説明

GaussianMixture

python

1df2 = df.copy() 2 3from sklearn.mixture import GaussianMixture 4 5model = GaussianMixture(n_components=2) 6model.fit(df2) 7df2['cluster'] = model.predict(df2) 8 9sns.scatterplot(x='ta', y='m', hue='cluster', data=df2)

イメージ説明

SpectralClustering

python

1df3 = df.copy() 2 3from sklearn import cluster 4 5spectral = cluster.SpectralClustering(n_clusters=2, eigen_solver='arpack', affinity='nearest_neighbors') 6 7clusters = spectral.fit(df3) 8 9df3['cluster'] = clusters.labels_ 10 11sns.scatterplot(x='ta', y='m', hue='cluster', data=df3)

イメージ説明

LinearRegression

python

1df4 = df.copy() 2 3from sklearn.linear_model import LinearRegression 4 5lr = LinearRegression() 6lr.fit(df4['ta'].values.reshape(-1, 1), df4['m'].values.reshape(-1, 1)) 7pred_y = lr.predict(df4['ta'].values.reshape(-1, 1)).reshape(-1) 8df4['cluster'] = (df4['m'] < pred_y).astype(int) 9 10for name, dfg in df4.groupby('cluster'): 11 lr.fit(dfg['ta'].values.reshape(-1, 1), dfg['m'].values.reshape(-1, 1)) 12 print(name, lr.coef_, lr.intercept_) 13 14sns.scatterplot(x='ta', y='m', hue='cluster', data=df4)

イメージ説明

補足情報(FW/ツールのバージョンなど)

Python3.8
pandas

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lehshell

2021/11/06 15:19

混合ガウス分布は試されましたか? from sklearn.mixture import GaussianMixture model = GaussianMixture(n_components=2) model.fit(df) print(model.predict(df))
barobaro

2021/11/06 23:10

サンプルデータを追加しました
barobaro

2021/11/06 23:11

lehshell さん 混合ガウス分布を試してみました 結果を追記しておりますがうまくいきませんでした 混合ガウス分布はまた別の用途で試してみます ありがとうございます
barobaro

2021/11/06 23:11

fourteenlength さん Spectral clusteringを試してみました 結果を追記しておりますがうまくいきませんでした パラメータも多いためほかのも試してみたいとおもいます ありがとうございます
guest

回答2

0

コードはないですが、RANSACを複数回行うのもありと思います。2回目はOutlierに対してRANSACを行うイメージでしょうか。

投稿2021/11/07 12:12

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

仮に、つねに2タイプでお互いのデータが交差しないという前提であれば
全体の回帰結果を得て、それぞれがその上下どちらかにあるかでクラスタリングすればよいかと思います。

Python

1import pandas as pd 2import random 3from sklearn.linear_model import LinearRegression 4import matplotlib.pyplot as plt 5import seaborn as sns 6 7# テストデータ 8xs = list(range(10)) 9y1 = [ 4*x + 0 + random.uniform(-5,5) for x in xs] 10y2 = [ 3*x -20 + random.uniform(-3,3) for x in xs] 11df = pd.DataFrame({'x':xs*2, 'y':y1+y2}) 12 13# 全体の結果からクラスタリング 14lr = LinearRegression() 15lr.fit(df['x'].values.reshape(-1,1), df['y'].values.reshape(-1,1)) 16pred_y = lr.predict(df['x'].values.reshape(-1,1)).reshape(-1) 17df['c'] = (df['y'] < pred_y).astype(int) # 上 or 下 18 19for name, df2 in df.groupby('c'): 20 lr.fit(df2['x'].values.reshape(-1,1), df2['y'].values.reshape(-1,1)) 21 print(name, lr.coef_, lr.intercept_) 22#0 [[3.98516963]] [0.03326308] 23#1 [[3.30785385]] [-22.03818755] 24 25sns.scatterplot(x='x', y='y', hue='c', data=df) 26plt.show()

イメージ説明

投稿2021/11/07 03:40

can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

barobaro

2021/11/07 13:31

ありがとうございます LinearRegressionの結果を追記しました いままでで一番いい結果がでたのですが 片方が0スタートではないため片方のデータに一部混ざってしまいました 片方が22~23ぐらいから始まるため交差することはないと思います
can110

2021/11/07 13:47

切片は関係なく、右下の外れ値が影響していると思われます。 LinearRegressionのかわりにHuberRegressorを試してみてはどうでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問