
데이터들은 공통의 특징을 가지고 있는데 사람을 나눌때 남성과 여성, 군집형태로 나눈것들은 많다. 연령대 별로도 그렇고
어떠한 물품을 소비했을때 소비에 대한 패턴으로 나누거나 똑같은 데이터가 있어도 a 파트 b 파트 c 파트로 나눠져 있다.
그렇지만 우리가 수치로 볼 수가 없다 인간은 인지능력의 한계가 있기 떄문에,
기존에는 통계를 뽑고 연관된 데이터를 뽑아서 직접 확인을 했었지만, 실수가 많고 정확한 군집이 안되는 경우가 많았다.
그렇게 쓰는거 보단 ai를 사용해 그룹핑을 하자 해서 그걸 사용한게 군집이다.
보통 마케팅에서 많이 쓴다. 소비패턴을 보고 어떤 쿠폰을 줄지 어떤 광고를 할지를 확실하게 확인가능하다.
이상치관련하여도 쓰고, 이미지 들어왔을때 세그렌테이션? 사용하여 어디어디에 있는지 분류하여 진행 할 수있다.
군집의 종류는 상당히 많지만 지금 볼건 k-군집, 병합군집, DBSCAN 3가지를 볼것이다.
k-평균 군집

입력한 후 => 초기화하면 랜덤하게 값을 하나씩 지정 => 그다음 이제 구역을 나눈다. => 데이터를 기준으로
센터를 재 계산한다. => 다시 그룹을 진행한다. => 다시 데이터를가지고 센터를 구한다.=> 다시 구간을 나눈다.=>
그리고 다시 센터를 계산한다. => 움직임이 없을시 최종 군집이 완성된다.
영역안에 들어오는 새로운 데이터는 해당군집이다.
지도학습과 비지도학습이 있는데 그 중간 사이에 준지도 학습이라는게 있다.
데이터가 부족할떄 부족한 데이터를 채울때, 데이터는 있는데 타겟이 없을때, 그걸 클러스팅을 이용해서 해당하는 데이터를
채워넣는다. 해당 부분은 어려워서 추후에 다시 배운다.
clusteringEx1
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
data = load_iris()
print(data.target)
print(data.target_names)
#['setosa' 'versicolor' 'virginica']
#[ 0 1 2 ]
print(data.data.shape)
#(150, 4)
x = data.data
plt.figure(figsize=(10,5))
plt.subplot(121)
plt.scatter(x[:,2], x[:,3], c='k', marker='.')
plt.xlabel('petal length', fontsize= 14)
plt.xlabel('petal width', fontsize= 14)
y = data.target
plt.subplot(122)
plt.plot(x[y==0, 2], x[y==0, 3], 'yo', label='iris setosa')
plt.plot(x[y==1, 2], x[y==1, 3], 'bs', label='iris versicolor')
plt.plot(x[y==2, 2], x[y==2, 3], 'g^', label='iris virginica')
plt.xlabel('petal length', fontsize=14)
plt.legend(loc='best')
plt.tick_params(labelleft=False)
plt.show()


import mglearn
mglearn.plots.plot_kmeans_algorithm()
plt.show()


clusteringEx2
blob_centers = np.array(
[[0.2, 2.3],
[-1.5, 2.3],
[-2.8, 1.8],
[-2.8, 2.8],
[-2.8, 1.3]]
)
blob_std = np.array([0.3, 0.3, 0.1, 0.1, 0.1])
x, y = make_blobs(n_samples=2000, centers=blob_centers,
cluster_std=blob_std, random_state=7)
def plot_clusters(x, y=None):
plt.scatter(x[:,0], x[:,1], c=y, s=1)
plt.xlabel('x')
plt.ylabel('y')
plt.figure(figsize=(10,6))
plot_clusters(x)
# plt.show()
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=5, random_state=40)
kmeans.fit(x) #타켓이 없다 비지도학습
y_pred = kmeans.predict(x)
print(y_pred)
#[2 2 4 ... 1 0 2]
print(len(y_pred))
print(kmeans.labels_)
#[2 2 4 ... 1 0 2]
print(kmeans.cluster_centers_)
x_new = np.array([[0, 2], [3, 2], [-3, 3], [3, 2.5]])
print(kmeans.predict(x_new)) #어떠한 클러스트에 속하는지 값을 확인

# kmeans_inertia_
# 각각 군집마다 센터기준에서 거리 제곱한걸 다 더한값, 값이 적을수록 밀집되어있다.
# 참고용이다.
kmeans_iter1 = KMeans(n_clusters=5, init='random', n_init=1, max_iter=1, random_state=0)
# 갯수를 지정해주면 포인트를 init=random으로 랜덤하게 잡아줌
# n_init= 랜덤하게 포인트를 한번잡고, 또랜덤한 포인트로 한번더 돌린다 이걸 들어간 숫자로 돌림
# max_iter= 이행횟수 한 사이클을 몇번 돌릴것인가?
kmeans_iter2 = KMeans(n_clusters=5, init='random', n_init=1, max_iter=2, random_state=0)
kmeans_iter3 = KMeans(n_clusters=5, init='random', n_init=1, max_iter=3, random_state=0)
kmeans_iter1.fit(x)
kmeans_iter2.fit(x)
kmeans_iter3.fit(x)
plt.figure(figsize=(11,9))
plt.subplot(321)
plot_data(x)
plot_centroids(kmeans_iter1.cluster_centers_, circle_color='r', cross_color='w')
plt.ylabel('x', fontsize=14, rotation=0)
plt.tick_params(labelbottom=False)
plt.title('update the centroid (init random)')
plt.subplot(322)
plot_decision_boundaries(kmeans_iter1, x, show_xlabels=False, show_ylabels=False)
plt.title('label the instance', fontsize=14)
plt.subplot(323)
plot_decision_boundaries(kmeans_iter2, x, show_xlabels=False, show_ylabels=False)
plot_centroids(kmeans_iter2.cluster_centers_)
plt.subplot(324)
plot_decision_boundaries(kmeans_iter3, x, show_xlabels=False, show_ylabels=False)
plot_centroids(kmeans_iter3.cluster_centers_)
plt.show()

clusteringEx3
blob_centers = np.array(
[[0.2, 2.3],
[-1.5, 2.3],
[-2.8, 1.8],
[-2.8, 2.8],
[-2.8, 1.3]]
)
blob_std = np.array([0.3, 0.3, 0.1, 0.1, 0.1])
x, y = make_blobs(n_samples=2000, centers=blob_centers,
cluster_std=blob_std, random_state=7)
inti_val = [[-3,3],[-3,2],[-3,1],[-1,2],[0,2]]
kmeans = KMeans(n_clusters=5, init='random', n_init=1, random_state=40)
kmeans.fit(x)
print(kmeans.cluster_centers_)
print(blob_centers)
print(kmeans.inertia_)
#160.6214742241464
kmeans_per_k = [KMeans(n_clusters=k, random_state=42).fit(x) for k in range(1, 10)]
inertias = [model.inertia_ for model in kmeans_per_k]
plt.figure(figsize=(10,6))
plt.plot(range(1, 10), inertias, 'bo-')
plt.xlabel('k', fontsize=14)
plt.ylabel('Inertia', fontsize=14)
plt.annotate('Elbow', xy=(4, inertias[3]),
xytext=(0.55, 0.55),
textcoords='figure fraction',
arrowprops=dict(facecolor='black', shrink=0.1))
plt.show()

실루엣이라는게 있다. b 와 a 가 있을때 b(i) - a(i) , max[(a(i)), (b(i))]
a = 자기 기준으로 평균거리라고 보고, b는 가장가까운 다른 클러스트와의 평균거리
from sklearn.metrics import silhouette_score
print(silhouette_score(x, kmeans.labels_))
#0.6758778442801251
silhouette_scores = [silhouette_score(x, model.labels_) for model in kmeans_per_k[1:]]
plt.figure(figsize=(10,6))
plt.plot(range(2,10), silhouette_scores, 'bo-')
plt.xlabel('x', fontsize=14)
plt.ylabel('Sihoutte score', fontsize=14)
plt.show()

clusteringEx4
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans
import seaborn as sns
import matplotlib.pyplot as plt
df=pd.DataFrame(columns=['height', 'weight'])
df.loc[0] = [185,60]
df.loc[1] = [180,60]
df.loc[2] = [185,70]
df.loc[3] = [165,63]
df.loc[4] = [155,68]
df.loc[5] = [170,75]
df.loc[6] = [175,80]
data_point = df.values
kmeans = KMeans(n_clusters=3).fit(data_point)
print(kmeans.cluster_centers_)
df['cluster_id'] = kmeans.labels_
print(df)
sns.lmplot(x='height', y='weight',
data=df, fit_reg=False,
scatter_kws={'s':200},
hue='cluster_id')
plt.show()

'AI' 카테고리의 다른 글
| Day66_Ai(4)_Am (0) | 2025.10.30 |
|---|---|
| Day65_Ai(3)_Pm (0) | 2025.10.29 |
| Day64_Ai(2)_Pm (0) | 2025.10.28 |
| Day64_Ai(2)_Am (0) | 2025.10.28 |
| Day63_Ai(1)_Pm (0) | 2025.10.27 |