반응형

군집  

지도 학습

           분류

           예측

sklearn

tensorflow

keras

 

지도 학습은 답이 있다. 규칙성 분류 예측

군집 : 답이 정해지지 않다 . k-means     , DBSCAN, hirachical

패턴 분류 일정한 패턴

군집 : 답이 정해져 있지 않다.독립변수 얼마일때 종속변수 답이 없다. 비슷한 것 묶어 놓기

강화학습은 게임

학습 통해서 예측

label 줘서 지도 학습

sigmoid : 함수 가진 특정을 분류

여러개 다중 분류 softmax

k-means 중심점으로 이동하여 하는데 데이터 전처리 과정이 어렵다.

종속변수 기존데이터에 대한 정답

준집 비지도 학습 종속변수 필요하지 않는다.

정규화 : 데이터가 0~ 1 사이에 데이터 바꿔서 상대적인 데이터로 바꾼다.

정규화해서 overfitting 해결할 수 있다.

overfitting  정규화 ,데이터 추가 후 학습

예측 . 분류를 하는데서

군집은 학습 5개 준다.

가까운 것 들 끼리 묶는 다. 중심점들이 계속 이동된다. 중심정 이동이 없을 때까지 5Clustring 0~ 4값이 나타난다.

dbscan clustring(밀도 기반 )

 

DBSCAN Clustring (밀도 기반 클러스터링) 알고리즘

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)은 데이터가 위치하고 있는 공간 밀집도를 기준으로 클러스터를 구분한다.

자기를 중심으로 반지름 R(epsilon)의 공간에 최소 M개의 포인트가 존재하는

점을 코어 포인트(core point)라고 부른다. -> 모델을 만들 때 반지름 R를 설정한다.

코어 포인트는 아니지만 반지름 R앆에 다른 코어 포인트가 있을 경우에 경계 포인트( border point)라고 부른다.

코어 포인트도 아니고 경계 포인트에도 속하지 않는 점을 noise(또는 outlier)라고 부른다.

 

DBSCAN 알고리즘의 장점

클러스터의 수를 미리 정하지 않아도 된다.

다양핚 모양의 크기의 클러스터를 얻는 것이 가능하다.

모양이 기하학적인 분포라도, 밀도 여부에 따라 군집도를 찾을 수 있다.

 Outlier 검출을 통해 필요하지 않는 noise 데이터를 검출하는 것이 가능하다.

 DBSCAN 알고리즘의 단점

반경(epsilon)으로 설정한 값에 민감하게 작용핚다.

DBSCAN 알고리즘을 사용하려면 적절핚 epsilon 값을 설정하는 것이 중요하다.

k - means clustiering은 클러스터의 수를 미리 지정해야 한다.

밀도에 따라 군집을 찾을 수 있다.

#학교알리미 공개용 데이터 중에서 서울시 중학교 졸업생의 짂로현황 데이터셋을
#사용하여 고등학교 짂학률이 비슷핚 중학교끼리 굮집(cluster)을 만들어 보자

#Step1. 데이터 준비
# 기본 라이브러리 불러오기
# 기본 라이브러리 불러오기
import pandas as pd
import folium
# 학교알리미 공개용 데이터 중에서 서울시 중학교 졸업생의 짂로현황 데이터셋
file_path = '2016_middle_shcool_graduates_report.xlsx'
df = pd.read_excel(file_path, header=0)
# IPython Console 디스플레이 옵션 설정하기
pd.set_option('display.width', None) # 출력화면의 너비
pd.set_option('display.max_rows', 100) # 출력핛 행의 개수 핚도
pd.set_option('display.max_columns', 30) # 출력핛 열의 개수 핚도
pd.set_option('display.max_colwidth', 20) # 출력핛 열의 너비
pd.set_option('display.unicode.east_asian_width', True) # 유니코드 사용 너비 조정
# 데이터프레임의 열 이름 출력
#print(df.columns.values)

# 데이터 살펴보기
#print(df.head())
#print('\n')
# 데이터 자료형 확인
#print(df.info())
#print('\n')
# 데이터 통계 요약정보 확인
#print(df.describe())
#print('\n')

#숫자일 경우는 문제가 없지만 자료형을 확인 해야 한다.
# 문자를 숫자로 해야 한다.

#지도에 위치 표시
msscool_map = folium.Map(location = [37.55,126.98] , tiles='Stamen Terrain' , zoom_start= 10 ) #중심에 들어갈 위치 설정


#중학교 위치정보를 CircleMarker로 표시
for name, lat, lng in zip(df.학교명, df.위도, df.경도):
    folium.CircleMarker([lat,lng],
                        radius = 5,
                        color= 'brown',
                        fill=True,
                        fill_color ='coral',
                        fill_opacity=0.7,
                        popup=name).add_to(msscool_map)

msscool_map.save('seoul_mschool_location.html')


# 지역, 코드, 유형, 주야 열을 원핪인코딩 처리
# 문자여서 하기 힘들어서 dummy 를 사용하여 원핫 인코딩으로 처리한다.
# 슷자로 바꾼다. 지역명 대신에 번호값을 바꾼다.
from sklearn import preprocessing
label_encoder = preprocessing.LabelEncoder() # label encoder 생성
# 모델이 인식핛 수 없는 문자형 데이터를 원핪인코딩으로 처리하여 더미 변수에 저장
onehot_location = label_encoder.fit_transform(df['지역']) # 지역구 이름
onehot_code = label_encoder.fit_transform(df['코드']) # 3, 5, 9
onehot_type = label_encoder.fit_transform(df['유형']) # 국립, 공립, 사립
onehot_day = label_encoder.fit_transform(df['주야']) # 주갂, 야갂
# 원핪인코딩된 결과를 새로운 열(변수)에 핛당
df['location'] = onehot_location # 지역
df['code'] = onehot_code # 코드
df['type'] = onehot_type # 유형
df['day'] = onehot_day # 주야
#print(df.head())
#값의 수에 따라서 번호가 정해진다.
#dummy 변수값을 쓰지 않고 숫자로 한다.

# sklearn 라이브러리에서 cluster 굮집 모델 가져오기
from sklearn import cluster
# 분석1. 과학고, 외고국제고, 자사고 진학률로 군집
# 분석에 사용핛 속성을 선택 (과학고, 외고국제고, 자사고 짂학률)
#print('분석1. 과학고, 외고국제고, 자사고 짂학률로 굮집')
columns_list = [10, 11, 14] # 각 컬럼의 인덱스 번호
#10 -> 과학고 컬럼의 index번호 3개 컬럼을 가져온다. 비슷한 것을 가져와서 군집한다.
x = df.iloc[:, columns_list] # 데이터 가져오기

#print(x[:5])
#print('\n')
# 설명 변수 데이터를 정규화
x = preprocessing.StandardScaler().fit(x).transform(x)
# DBSCAN 모델 객체 생성
# 밀도 계산의 기준이 되는 반지름 R(eps=0.2)과 최소 포인트 개수 M(min_samples=5) 설정
dbm = cluster.DBSCAN(eps=0.2, min_samples=5) #5개를 기준으로 모은다.
#모든 점 들은 core point가 될 수 있다.
#반경에 따라 민감하게 반응을 한다.
# DBSCAN 모델 학습
dbm.fit(x)

# 예측 (굮집) 결과를 출력핛 열(속성)의 값 구하기
# 모델의 labels_ 속성으로 확인하면 5개의 클러스터 값 ( -1, 0, 1, 2, 3 ) 으로 나타남
cluster_label = dbm.labels_
#print(cluster_label) # -1, 0, 1, 2, 3
#print('\n')
# 예측(굮집) 결과를 저장핛 열(Cluster)을 데이터프레임에 추가
df['Cluster'] = cluster_label # Cluster 열 추가됨
#print(df.head())
print(df[['과학고','외고_국제고','자사고','Cluster']])
print('\n')
# 클러스터 값으로 그룹화하고, 그룹별로 내용 출력 (첫 5행만 출력)
grouped_cols = [1, 2, 4] + columns_list # 1:지역명, 2:학교명, 4:유형
grouped = df.groupby('Cluster')
# -1 범위를 벗어난 것   제외한다.
# 클러스터 0 : 외고_국제고와 자사고 합격률은 높지만 과학고 합격자가 없다.
# 클러스터 1 : 자사고 합격자만 존재하는 그룹
# 클러스터 2 : 자사고 합격률이 매우 높으면서 과학고와 외고_국제고 합격자도 일부 존재핚다.
# 클러스터 3 : 과학고 합격자 없이 외고_국제고와 자사고 합격자를 배출핚 점은
# 클러스터 0과 비슷하지만, 외고_국제고 합격률이 클러스터 0에 비해현저하게 낮다.

for key, group in grouped:
    print('* key :', key) # 클러스터 값: -1, 0, 1, 2, 3 => 4개로 컬러스팅 된다. 5개 값이 되여있다.
    print('* number :', len(group)) # 각 클러스터 속핚 학교수
    print(group.iloc[:, grouped_cols].head()) # 5개의 데이터 출력
    print('\n')

# 그래프로 표현 - 시각화
colors = {-1:'gray', 0:'coral', 1:'blue', 2:'green', 3:'red', 4:'purple',
5:'orange', 6:'brown', 7:'brick', 8:'yellow', 9:'magenta', 10:'cyan'}
cluster_map = folium.Map(location=[37.55,126.98], tiles='Stamen Terrain',
zoom_start=12)

for name, lat, lng, clus in zip(df.학교명, df.위도, df.경도, df.Cluster):
    folium.CircleMarker([lat, lng],
    radius=5, # 원의 반지름
    color=colors[clus], # 원의 둘레 색상
    fill=True,
    fill_color=colors[clus], # 원을 채우는 색
    fill_opacity=0.7, # 투명도
    popup=name
    ).add_to(cluster_map)
    # 지도를 html 파일로 저장하기
cluster_map.save('seoul_mschool_cluster.html')


# 분석2. 과학고, 외고_국제고, 자사고 진학률, 유형(국립,공립,사립)으로 군집
# X2 데이터셋에 대하여 위의 과정을 반복(과학고, 외고_국제고, 자사고 짂학률, 유형)
print('분석2. 과학고, 외고_국제고, 자사고 짂학률, 유형(국립,공립,사립)으로 굮집')
columns_list2 = [10, 11, 14, 23]
x2 = df.iloc[:, columns_list2]
print(x2[:5])
print('\n')
# 설명 변수 데이터를 정규화
x2 = preprocessing.StandardScaler().fit(x2).transform(x2)
# DBSCAN 모델 객체 생성
# 밀도 계산의 기준이 되는 반지름 R(eps=0.2)과 최소 포인트 개수 M(min_samples=5) 설정
dbm2 = cluster.DBSCAN(eps=0.2, min_samples=5)
# DBSCAN 모델 학습
dbm2.fit(x2)

# 예측(굮집) 결과를 저장핛 열(Cluster2)을 데이터프레임에 추가
df['Cluster2'] = dbm2.labels_ # Cluster2 열 추가됨
# 클러스터 값으로 그룹화하고, 그룹별로 내용 출력 (첫 5행만 출력)
grouped2_cols = [1, 2, 4] + columns_list2 # 1:지역명, 2:학교명, 4:유형
grouped2 = df.groupby('Cluster2')
for key, group in grouped2:
    print('* key :', key) # 클러스터 값: -1, 0 ~ 10
    print('* number :', len(group)) # 각 클러스터 속핚 학교수
    print(group.iloc[:, grouped2_cols].head()) # 5개의 데이터 출력
    print('\n')

cluster2_map = folium.Map(location=[37.55,126.98], tiles='Stamen Terrain',
zoom_start=12)
for name, lat, lng, clus in zip(df.학교명, df.위도, df.경도, df.Cluster2):
    folium.CircleMarker([lat, lng],
    radius=5, # 원의 반지름
    color=colors[clus], # 원의 둘레 색상
    fill=True,
    fill_color=colors[clus], # 원을 채우는 색
    fill_opacity=0.7, # 투명도
    popup=name
    ).add_to(cluster2_map)
# 지도를 html 파일로 저장하기
cluster2_map.save('seoul_mschool_cluster2.html')


# 분석3. 과학고, 외고_국제고 군집
# X3 데이터셋에 대하여 위의 과정을 반복(과학고, 외고_국제고)
print('분석3. 과학고, 외고_국제고 굮집')
columns_list3 = [10, 11]
x3 = df.iloc[:, columns_list3]
print(x3[:5])
print('\n')

# 설명 변수 데이터를 정규화
x3 = preprocessing.StandardScaler().fit(x3).transform(x3)
# DBSCAN 모델 객체 생성
# 밀도 계산의 기준이 되는 반지름 R(eps=0.2)과 최소 포인트 개수 M(min_samples=5) 설정
dbm3 = cluster.DBSCAN(eps=0.2, min_samples=5)
# DBSCAN 모델 학습
dbm3.fit(x3)
# 예측(굮집) 결과를 저장핛 열(Cluster3)을 데이터프레임에 추가
df['Cluster3'] = dbm3.labels_ # Cluster3 열 추가됨
# 클러스터 값으로 그룹화하고, 그룹별로 내용 출력 (첫 5행만 출력)
grouped3_cols = [1, 2, 4] + columns_list3 # 1:지역명, 2:학교명, 4:유형
grouped3 = df.groupby('Cluster3')

for key, group in grouped3:
    print('* key :', key) # 클러스터 값: -1, 0 ~ 6
    print('* number :', len(group)) # 각 클러스터 속핚 학교수
    print(group.iloc[:, grouped3_cols].head()) # 5개의 데이터 출력
    print('\n')


cluster3_map = folium.Map(location=[37.55,126.98], tiles='Stamen Terrain',
zoom_start=12)
for name, lat, lng, clus in zip(df.학교명, df.위도, df.경도, df.Cluster3):
    folium.CircleMarker([lat, lng],
    radius=5, # 원의 반지름
    color=colors[clus], # 원의 둘레 색상
    fill=True,
    fill_color=colors[clus], # 원을 채우는 색
    fill_opacity=0.7, # 투명도
    popup=name
    ).add_to(cluster3_map)
# 지도를 html 파일로 저장하기
cluster3_map.save('seoul_mschool_cluster3.html')

# visualization
import numpy as np
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
scaler_ss = StandardScaler().fit(x)

x_scaled_ss = scaler_ss.transform(x)
clusters_ss = dbm.fit_predict(x)


# visualization
df = np.hstack([x_scaled_ss, clusters_ss.reshape(-1, 1)]) # x_scaled_ss 오른쪽에 1열 붙이기

df_ft4 = df[df[:,3]==-1, :] # 클러스터 0 추출
df_ft0 = df[df[:,3]==0, :] # 클러스터 0 추출
df_ft1 = df[df[:,3]==1, :] # 클러스터 1 추출
df_ft2 = df[df[:,3]==2, :] # 클러스터 1 추출
df_ft3 = df[df[:,3]==3, :] # 클러스터 1 추출

from mpl_toolkits.mplot3d import Axes3D
# scatter plot
fig = plt.figure( figsize=(10,10))
ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)
ax.scatter(df_ft4[:, 0],df_ft4[:, 1],df_ft4[:, 2],alpha=0.5, c=colors[-1],marker="x")
ax.scatter(df_ft0[:, 0],df_ft0[:, 1],df_ft0[:, 2],alpha=0.5, c=colors[0])
ax.scatter(df_ft1[:, 0],df_ft1[:, 1],df_ft1[:, 2],alpha=0.5, c=colors[1])
ax.scatter(df_ft2[:, 0],df_ft2[:, 1],df_ft2[:, 2],alpha=0.5, c=colors[2])
ax.scatter(df_ft3[:, 0],df_ft3[:, 1],df_ft3[:, 2],alpha=0.5, c=colors[3])
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()

 

동작은 다음과 같다.

  1. 랜덤으로 데이터 포인트를 뽑고, 데이터 포인트에서 eps(epsilon)의 거리(기본값은 유클리디안 거리)안에 데이터 포인트를 찾는다.
  2. 만약 찾은 포인트가 min_sample수보다 적으면 noise로 처리하고, min_sample보다 많으면 새로운 클러스터 레이블 할당
  3. 새로운 클러스터에 할당된 포인트들의 eps 거리 안의 모든 이웃을 찾아서 클러스터 레이블이 할당되지 않았다면 현재의 클러스터에 포함시킨다.
  4. 더 이상 데이터 포인가 없으면 클러스터 레이블이 할당되지 않은 데이터 포인트들에 대해 1~3 반복

 

알고리즘:

1. 무작위로 데이터 포인트를 선택

 

2. 그 포인트에서 eps 거리안의 모든 포인트를 찾음

2-1 eps 거리 안에 있는 데이터 포인트 수가 min_samples보다 적다면 어떤 클래스에도 속하지 않는 잡음noise로 레이블

2-2 eps 거리 안에 있는 데이터 포인트 수가 min_samples보다 많으면 핵심 포인트로 레이블하고 새로운 클러스터 레이블할당

 

3. 2-2의 핵심 포인트의 eps거리안의 모든 이웃을 살핌

3-1 만약 어떤 클러스터에도 아직 할당되지 않았다면 바로 전에 만든 클러스터 레이블을 할당

3-2 만약 핵심 포인트면 그 포인트의 이웃을 차례로 확인

 

4. eps 거리안에 더이상 핵심 포인트가 없을 때까지 진행

 

minPtscore point 포함한다.

#학교알리미 공개용 데이터 중에서 서울시 중학교 졸업생의 짂로현황 데이터셋을
#사용하여 고등학교 짂학률이 비슷핚 중학교끼리 굮집(cluster)을 만들어 보자

#Step1. 데이터 준비
# 기본 라이브러리 불러오기
# 기본 라이브러리 불러오기
import pandas as pd
import folium
# 학교알리미 공개용 데이터 중에서 서울시 중학교 졸업생의 짂로현황 데이터셋
file_path = '2016_middle_shcool_graduates_report.xlsx'
df = pd.read_excel(file_path, header=0)
# IPython Console 디스플레이 옵션 설정하기
pd.set_option('display.width', None) # 출력화면의 너비
pd.set_option('display.max_rows', 100) # 출력핛 행의 개수 핚도
pd.set_option('display.max_columns', 30) # 출력핛 열의 개수 핚도
pd.set_option('display.max_colwidth', 20) # 출력핛 열의 너비
pd.set_option('display.unicode.east_asian_width', True) # 유니코드 사용 너비 조정
# 데이터프레임의 열 이름 출력
#print(df.columns.values)

# 데이터 살펴보기
#print(df.head())
#print('\n')
# 데이터 자료형 확인
#print(df.info())
#print('\n')
# 데이터 통계 요약정보 확인
#print(df.describe())
#print('\n')

#숫자일 경우는 문제가 없지만 자료형을 확인 해야 한다.
# 문자를 숫자로 해야 한다.

#지도에 위치 표시
msscool_map = folium.Map(location = [37.55,126.98] , tiles='Stamen Terrain' , zoom_start= 10 ) #중심에 들어갈 위치 설정


#중학교 위치정보를 CircleMarker로 표시
for name, lat, lng in zip(df.학교명, df.위도, df.경도):
    folium.CircleMarker([lat,lng],
                        radius = 5,
                        color= 'brown',
                        fill=True,
                        fill_color ='coral',
                        fill_opacity=0.7,
                        popup=name).add_to(msscool_map)

msscool_map.save('seoul_mschool_location.html')


# 지역, 코드, 유형, 주야 열을 원핪인코딩 처리
# 문자여서 하기 힘들어서 dummy 를 사용하여 원핫 인코딩으로 처리한다.
# 슷자로 바꾼다. 지역명 대신에 번호값을 바꾼다.
from sklearn import preprocessing
label_encoder = preprocessing.LabelEncoder() # label encoder 생성
# 모델이 인식핛 수 없는 문자형 데이터를 원핪인코딩으로 처리하여 더미 변수에 저장
onehot_location = label_encoder.fit_transform(df['지역']) # 지역구 이름
onehot_code = label_encoder.fit_transform(df['코드']) # 3, 5, 9
onehot_type = label_encoder.fit_transform(df['유형']) # 국립, 공립, 사립
onehot_day = label_encoder.fit_transform(df['주야']) # 주갂, 야갂
# 원핪인코딩된 결과를 새로운 열(변수)에 핛당
df['location'] = onehot_location # 지역
df['code'] = onehot_code # 코드
df['type'] = onehot_type # 유형
df['day'] = onehot_day # 주야
#print(df.head())
#값의 수에 따라서 번호가 정해진다.
#dummy 변수값을 쓰지 않고 숫자로 한다.

# sklearn 라이브러리에서 cluster 굮집 모델 가져오기
from sklearn import cluster
# 분석1. 과학고, 외고국제고, 자사고 진학률로 군집
# 분석에 사용핛 속성을 선택 (과학고, 외고국제고, 자사고 짂학률)
#print('분석1. 과학고, 외고국제고, 자사고 짂학률로 굮집')
columns_list = [10, 11, 14] # 각 컬럼의 인덱스 번호
#10 -> 과학고 컬럼의 index번호 3개 컬럼을 가져온다. 비슷한 것을 가져와서 군집한다.
x = df.iloc[:, columns_list] # 데이터 가져오기

#print(x[:5])
#print('\n')
# 설명 변수 데이터를 정규화
x = preprocessing.StandardScaler().fit(x).transform(x)
# DBSCAN 모델 객체 생성
# 밀도 계산의 기준이 되는 반지름 R(eps=0.2)과 최소 포인트 개수 M(min_samples=5) 설정
dbm = cluster.DBSCAN(eps=0.2, min_samples=5) #5개를 기준으로 모은다.
#모든 점 들은 core point가 될 수 있다.
#반경에 따라 민감하게 반응을 한다.
# DBSCAN 모델 학습
dbm.fit(x)

# 예측 (굮집) 결과를 출력핛 열(속성)의 값 구하기
# 모델의 labels_ 속성으로 확인하면 5개의 클러스터 값 ( -1, 0, 1, 2, 3 ) 으로 나타남
cluster_label = dbm.labels_
#print(cluster_label) # -1, 0, 1, 2, 3
#print('\n')
# 예측(굮집) 결과를 저장핛 열(Cluster)을 데이터프레임에 추가
df['Cluster'] = cluster_label # Cluster 열 추가됨
#print(df.head())
print(df[['과학고','외고_국제고','자사고','Cluster']])
print('\n')
# 클러스터 값으로 그룹화하고, 그룹별로 내용 출력 (첫 5행만 출력)
grouped_cols = [1, 2, 4] + columns_list # 1:지역명, 2:학교명, 4:유형
grouped = df.groupby('Cluster')
# -1 범위를 벗어난 것   제외한다.
# 클러스터 0 : 외고_국제고와 자사고 합격률은 높지만 과학고 합격자가 없다.
# 클러스터 1 : 자사고 합격자만 존재하는 그룹
# 클러스터 2 : 자사고 합격률이 매우 높으면서 과학고와 외고_국제고 합격자도 일부 존재핚다.
# 클러스터 3 : 과학고 합격자 없이 외고_국제고와 자사고 합격자를 배출핚 점은
# 클러스터 0과 비슷하지만, 외고_국제고 합격률이 클러스터 0에 비해현저하게 낮다.

for key, group in grouped:
    print('* key :', key) # 클러스터 값: -1, 0, 1, 2, 3 => 4개로 컬러스팅 된다. 5개 값이 되여있다.
    print('* number :', len(group)) # 각 클러스터 속핚 학교수
    print(group.iloc[:, grouped_cols].head()) # 5개의 데이터 출력
    print('\n')

# 그래프로 표현 - 시각화
colors = {-1:'gray', 0:'coral', 1:'blue', 2:'green', 3:'red', 4:'purple',
5:'orange', 6:'brown', 7:'brick', 8:'yellow', 9:'magenta', 10:'cyan'}
cluster_map = folium.Map(location=[37.55,126.98], tiles='Stamen Terrain',
zoom_start=12)

for name, lat, lng, clus in zip(df.학교명, df.위도, df.경도, df.Cluster):
    folium.CircleMarker([lat, lng],
    radius=5, # 원의 반지름
    color=colors[clus], # 원의 둘레 색상
    fill=True,
    fill_color=colors[clus], # 원을 채우는 색
    fill_opacity=0.7, # 투명도
    popup=name
    ).add_to(cluster_map)
    # 지도를 html 파일로 저장하기
cluster_map.save('seoul_mschool_cluster.html')


# 분석2. 과학고, 외고_국제고, 자사고 진학률, 유형(국립,공립,사립)으로 군집
# X2 데이터셋에 대하여 위의 과정을 반복(과학고, 외고_국제고, 자사고 짂학률, 유형)
print('분석2. 과학고, 외고_국제고, 자사고 짂학률, 유형(국립,공립,사립)으로 굮집')
columns_list2 = [10, 11, 14, 23]
x2 = df.iloc[:, columns_list2]
print(x2[:5])
print('\n')
# 설명 변수 데이터를 정규화
x2 = preprocessing.StandardScaler().fit(x2).transform(x2)
# DBSCAN 모델 객체 생성
# 밀도 계산의 기준이 되는 반지름 R(eps=0.2)과 최소 포인트 개수 M(min_samples=5) 설정
dbm2 = cluster.DBSCAN(eps=0.2, min_samples=5)
# DBSCAN 모델 학습
dbm2.fit(x2)

# 예측(굮집) 결과를 저장핛 열(Cluster2)을 데이터프레임에 추가
df['Cluster2'] = dbm2.labels_ # Cluster2 열 추가됨
# 클러스터 값으로 그룹화하고, 그룹별로 내용 출력 (첫 5행만 출력)
grouped2_cols = [1, 2, 4] + columns_list2 # 1:지역명, 2:학교명, 4:유형
grouped2 = df.groupby('Cluster2')
for key, group in grouped2:
    print('* key :', key) # 클러스터 값: -1, 0 ~ 10
    print('* number :', len(group)) # 각 클러스터 속핚 학교수
    print(group.iloc[:, grouped2_cols].head()) # 5개의 데이터 출력
    print('\n')

cluster2_map = folium.Map(location=[37.55,126.98], tiles='Stamen Terrain',
zoom_start=12)
for name, lat, lng, clus in zip(df.학교명, df.위도, df.경도, df.Cluster2):
    folium.CircleMarker([lat, lng],
    radius=5, # 원의 반지름
    color=colors[clus], # 원의 둘레 색상
    fill=True,
    fill_color=colors[clus], # 원을 채우는 색
    fill_opacity=0.7, # 투명도
    popup=name
    ).add_to(cluster2_map)
# 지도를 html 파일로 저장하기
cluster2_map.save('seoul_mschool_cluster2.html')


# 분석3. 과학고, 외고_국제고 군집
# X3 데이터셋에 대하여 위의 과정을 반복(과학고, 외고_국제고)
print('분석3. 과학고, 외고_국제고 굮집')
columns_list3 = [10, 11]
x3 = df.iloc[:, columns_list3]
print(x3[:5])
print('\n')

# 설명 변수 데이터를 정규화
x3 = preprocessing.StandardScaler().fit(x3).transform(x3)
# DBSCAN 모델 객체 생성
# 밀도 계산의 기준이 되는 반지름 R(eps=0.2)과 최소 포인트 개수 M(min_samples=5) 설정
dbm3 = cluster.DBSCAN(eps=0.2, min_samples=5)
# DBSCAN 모델 학습
dbm3.fit(x3)
# 예측(굮집) 결과를 저장핛 열(Cluster3)을 데이터프레임에 추가
df['Cluster3'] = dbm3.labels_ # Cluster3 열 추가됨
# 클러스터 값으로 그룹화하고, 그룹별로 내용 출력 (첫 5행만 출력)
grouped3_cols = [1, 2, 4] + columns_list3 # 1:지역명, 2:학교명, 4:유형
grouped3 = df.groupby('Cluster3')

for key, group in grouped3:
    print('* key :', key) # 클러스터 값: -1, 0 ~ 6
    print('* number :', len(group)) # 각 클러스터 속핚 학교수
    print(group.iloc[:, grouped3_cols].head()) # 5개의 데이터 출력
    print('\n')


cluster3_map = folium.Map(location=[37.55,126.98], tiles='Stamen Terrain',
zoom_start=12)
for name, lat, lng, clus in zip(df.학교명, df.위도, df.경도, df.Cluster3):
    folium.CircleMarker([lat, lng],
    radius=5, # 원의 반지름
    color=colors[clus], # 원의 둘레 색상
    fill=True,
    fill_color=colors[clus], # 원을 채우는 색
    fill_opacity=0.7, # 투명도
    popup=name
    ).add_to(cluster3_map)
# 지도를 html 파일로 저장하기
cluster3_map.save('seoul_mschool_cluster3.html')

# visualization
import numpy as np
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
scaler_ss = StandardScaler().fit(x)

x_scaled_ss = scaler_ss.transform(x)
clusters_ss = dbm.fit_predict(x)


# visualization
df = np.hstack([x_scaled_ss, clusters_ss.reshape(-1, 1)]) # x_scaled_ss 오른쪽에 1열 붙이기

df_ft4 = df[df[:,3]==-1, :] # 클러스터 0 추출
df_ft0 = df[df[:,3]==0, :] # 클러스터 0 추출
df_ft1 = df[df[:,3]==1, :] # 클러스터 1 추출
df_ft2 = df[df[:,3]==2, :] # 클러스터 1 추출
df_ft3 = df[df[:,3]==3, :] # 클러스터 1 추출

from mpl_toolkits.mplot3d import Axes3D
# scatter plot
fig = plt.figure( figsize=(10,10))
ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)
ax.scatter(df_ft4[:, 0],df_ft4[:, 1],df_ft4[:, 2],alpha=0.5, c=colors[-1],marker="x")
ax.scatter(df_ft0[:, 0],df_ft0[:, 1],df_ft0[:, 2],alpha=0.5, c=colors[0])
ax.scatter(df_ft1[:, 0],df_ft1[:, 1],df_ft1[:, 2],alpha=0.5, c=colors[1])
ax.scatter(df_ft2[:, 0],df_ft2[:, 1],df_ft2[:, 2],alpha=0.5, c=colors[2])
ax.scatter(df_ft3[:, 0],df_ft3[:, 1],df_ft3[:, 2],alpha=0.5, c=colors[3])
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()

 

Tensorflow

텐서플로 1.X 버전의 코드를 수정하지 않고 텐서플로 2.0에서 실행할 수 있다.

텐서플로 1.X 파일에 아래의 코드 2줄을 추가하면 텐서플로 2.0에서 실행 가능하다.

 

import tensorflow.compat.v1 as tf

tf.disable_v2_behavior() -> 1.x파일을 2.대에서 사용하기

 

 

 Tensorflow의 특징

데이터 플로우 그래프(Graph)를 통한 풍부한 표현력

코드 수정없이 CPU/GPU 모드로 동작

아이디어 테스트에서 서비스 단계까지 이용가능

계산 구조와 목표 함수만 정의되면 자동으로 미분 계산을 처리

 Python / C++ 를 지원하며, SWIG를 통해 다양한 언어 지원 가능

 

 

pycharm 가상환경 추가

tensorflow  임의로 만들고

체크 박스는 안해야 한다. 이전의 것이 된다.

make avaliable to all projects 새로운 것 만든다.

독립을 시켜야 하고 따로 만들어야 한다.

 

새로운 모듈 추가

 

seaborn

matplotlib

scikit-learn

tensorflow 1.15 번전 추가

지금은 호재 되여있는 상태이다 import 하면 사용한다.

2점 정도 되면 keras 가 내장되여있다.

2점 대는 keras기반으로 된다.

 

 

 

import tensorflow as tf

print(tf.__versioin__)

 

hello = tf.constant('Hello, TensorFlow!') # 상수 선언

sess = tf.Session() # 세션 시작

print(sess.run(hello)) # 세션 실행

b'Hello, TensorFlow!'

bString b indicates Bytes literals

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow 1.x!') # 상수 선언
sess = tf.Session() # 세션 시작
print(sess.run(hello)) # 세션 실행
b'Hello, TensorFlow!'
b‟String‟ „b‟ indicates Bytes literals


#상수 정의 
a = tf.constant(2)
b = tf.constant(3)

c= a+b

print(a)
print(b)
print(c)

#세션 셜정
sess = tf.Session()

#연산 결과 출력
print(sess.run(a))
print(sess.run(b))
print(sess.run(c))
print(sess.run(c))

#상수 정의 

a = tf.constant(2)

b = tf.constant(3)

c = tf.constant(4)

 

#상수 선언

cal1 = a+b *c

cal2 = (a+b) * c

 

세션 설정

sess = tf.Session()

 

#연산 결과

print(sess.run(cal1))

print(sess.run(cal2))

연산자 기호 대신에 함수를 가지고 연산한다.

#상수 선언
node1 = tf.constant(3.0 , tf.float32)
node2 = tf.constant(4.0 , tf.float32)

#상수 선언
node3 = tf.add(node1, node2)
node4 = tf.multiply(node1, node2)

#session 설정
sess = tf.Session()

#연산 결과
# sesion에서는 1.대에서는 사용하지만 2.점대에서는 사라진다.
print(sess.run([node1, node2]))
print(sess.run([node3, node4]))

#상수 선언
x1 = tf.constant([1,2,3,4])
x2 = tf.constant([5,6,7,8])

#상수 산술 연산
cal1 = tf.add(x1,x2)
cal2 = tf.subtract(x1,x2)
cal3 = tf.multiply(x1, x2) # 곱하기
cal4 = tf.divide(x1, x2) # 나누기
# initialize the Session
sess = tf.Session()
# print the result
print(sess.run(cal1))
print(sess.run(cal2))
print(sess.run(cal3))
print(sess.run(cal4))

상수는 constant

변수는 variable

 

 Tensorflow의 변수(variable)

w = tf.Variable(<initial-value>, name=<optional-name>)

#변수 선언
v = tf.Variable(50)

print(v)

#세션 선언
sess = tf.Session()

#print(sess.run(v)) #오류가 난다. #초기화를 ㅎ해줘야 한다.

#모든 변수를 초기화
sess.run(tf.global_variables_initializer())
print(sess.run(v)) #오류가 난다. #초기화를 ㅎ해줘야 한다.

모든 변수를 초기화

init = tf.global_variables_initializer()

sess = tf.Session()

sess.run(init) # Session 통해서 init변수를 실행 시켜야한다.

print('v1=', sess.run(v1)) # v1= 50

print('v2=', sess.run(v2)) # v2= [1 2 3]

print('v3=', sess.run(v3)) # v3= [[1] [2]]

 

import tensorflow as tf
x = tf.Variable([[3., 3.]]) # shape: (1, 2) 1행 2열
y = tf.Variable([[2.],[2.]]) # shape: (2, 1) 2행 1열
mat = tf.matmul(x, y) # matrix 곱셈
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
print(x.get_shape()) # shape: (1, 2) 1행 2열
print(y.get_shape()) # shape: (2, 1) 2행 1열
print('x=', sess.run(x))
print('y=', sess.run(y))
print('mat=', sess.run(mat))

zeros -> 0으로 체우기

ones ->1로 채우기

tf.zeros_like(tf.ones([2,3]))->

만약 크기를 튜플로 명시하지 않고 다른 배열과 같은 크기의 배열을 생성하고 싶다면 ones_like, zeros_like 명령을 사용한다.

tf.fill([2,3], 2) fill 23열로 체우기 체워야 할 자리가 2번째에 들어간다.

 

v3 = tf.Variable(tf.zeros_like(tf.ones([2,3]))) 원래 1인데 0으로 바꿔진다

반응형

'Study > 머신러닝' 카테고리의 다른 글

머신러닝-8  (1) 2020.11.21
머신러닝-7  (0) 2020.11.20
머신러닝-5  (0) 2020.11.19
머신러닝-4  (0) 2020.11.17
머신러닝-3  (0) 2020.11.16

+ Recent posts