박스 카운트 법에 의한 프랙탈 차원 해석을 3 차원으로 해 보았다
12263 단어 프랙탈 차원박스 카운트 방법파이썬회귀 분석scikit-learn
소개
구조물의 아름다움을 정량적으로 평가하십시오.
라는 연구를 실시하고 있습니다.
그 정량화 수법으로서 프랙탈 차원이라고 하는 것을 하나의 지표로 하고 있습니다.
그리고, 프랙탈 차원을 구하기 위해서는 박스 카운트법이라고 하는 방법을 이용합니다만,
이것을 3차원으로 취급하고 있는 예가 조사해도 나오지 않았기 때문에, 기사로 해 보았습니다.
프랙탈 차원이란?
프랙탈 차원
Wikipedia에는 이렇게 있습니다.
간단히 파악하면 1차원과 2차원, 2차원과 3차원 사이의 차원을 비정수의 값으로 표현할 수 있는 것입니다.
복잡성을 나타낼 수 있습니다.
이것을 이용해 경관이나 회화라고 하는 것의 정량적 평가가 행해지고 있습니다.
프랙탈 차원 해석
이번에는 예로서 200 × 200 × 200의 큐브
1로 초기화 한 3 차원 numpy 배열로 실험해 보겠습니다.
실제로 STL 파일을로드numpy-stl
를 사용하여 배열을 수행합니다.
(자세한 내용은 향후 집필 예정입니다)
박스 카운트 방법
박스 카운트법에 관해서는 여기의 기사를 알기 쉽다고 생각하므로, 링크를 붙여 주시겠습니다.
표면 거칠기 곡선의 프랙탈 분석
이것을 3 차원적으로 생각합니다.
1. 입방체를 격자 모양으로 분할
2. 격자 내에 물체가 포함되어 있으면 카운트
3. 격자의 변의 길이를 grid_size, 카운트수를 n으로 한다
4. log(grid_size)와 log(n) 플롯
5. 최소제곱법에 의한 선형회귀를 실시한다
6. 그 회귀 계수를 프랙탈 차원으로 한다
이 격자의 크기를 차례로 바꿉니다.
상자에 포함된 요소를 계산하는 함수
3차원 배열을 x방향→y방향→z방향의 순서로 주사
1의 판정은 np.any
3d_fractal.pydef count(arr, x, y, z, b):
i = j = k = 0
b_tmp = b
b_tmp2 = b
ct = 0
j_tmp = b
k_tmp = b
while k < z:
while j < y:
while i < x:
if (np.any(arr[i:b, j:j_tmp, k:k_tmp] == 1)):
ct += 1
i += b_tmp
b += b_tmp
# 折り返し
j += b_tmp2
j_tmp += b_tmp2
b = b_tmp2
i = 0
# 折り返し
k += b_tmp2
k_tmp += b_tmp2
b = b_tmp2
j = b_tmp2
i = 0
j = 0
main 함수
격자 크기를 200에서 1/2씩 100, 50, ... 과 1이 될 때까지 count()
의 처리를 반복합니다.
격자 크기가 1일 때의 카운트는 200×200×200 = 80,00,000이 되어야 합니다.
3d_fractal.pydef main():
x = y = z = 200
graph_x = []
graph_y = []
array3d = np.ones((x, y, z))
ct_1 = np.count_nonzero(array3d == 1)
grid_size = max(x, y, z)
while grid_size >= 1:
n = count(array3d, x, y, z, grid_size)
graph_x.append(math.log(grid_size))
graph_y.append(math.log(n))
print(grid_size, n)
print (math.log(grid_size), math.log(n))
grid_size = int(grid_size / 2)
선형 회귀
카운트한 결과로부터 선형 회귀를 실시합니다.
회귀 처리에는 scikit-learn
클래스sklearn.linear_model.LinearRegression
를 사용합니다.
3d_fractal.py graph_x = np.array(graph_x).reshape((len(graph_x), 1)) # 1列にする
graph_y = np.array(graph_y).reshape((len(graph_y), 1))
model_lr = LinearRegression()
# 予測モデル作成
model_lr.fit(graph_x, graph_y)
plt.xlabel("log(grid_size)")
plt.ylabel("log(n)")
plt.plot(graph_x, graph_y, 'o')
plt.plot(graph_x, model_lr.predict(graph_x), linestyle="solid")
plt.grid()
plt.show()
# フラクタル次元 = 回帰係数
fractal = model_lr.coef_[0][0] * -1
print("Fractal : ", fractal)
결과
이것은 결과의 로그 그래프입니다.
가로축에 격자 크기의 로그
세로축에 카운트수의 log
이 회귀 계수는 프랙탈 차원입니다.
200 1
5.298317366548036 0.0
100 8
4.605170185988092 2.0794415416798357
50 64
3.912023005428146 4.1588830833596715
25 512
3.2188758248682006 6.238324625039508
12 4913
2.4849066497880004 8.499640032168648
6 39304
1.791759469228055 10.579081573848484
3 300763
1.0986122886681098 12.614077858172898
1 8000000
0.0 15.89495209964411
Fractal : 3.004579190748091
결과는 다음과 같습니다.
프랙탈 차원은 3.004579190748091
그렇다면 거의 이론치입니다.
200에서 반복했을 때 25/2 = 12로 나눌 수없는 경우가 생겨 조금 어긋남이 나왔습니다.
요약
프랙탈 차원
Wikipedia에는 이렇게 있습니다.
간단히 파악하면 1차원과 2차원, 2차원과 3차원 사이의 차원을 비정수의 값으로 표현할 수 있는 것입니다.
복잡성을 나타낼 수 있습니다.
이것을 이용해 경관이나 회화라고 하는 것의 정량적 평가가 행해지고 있습니다.
프랙탈 차원 해석
이번에는 예로서 200 × 200 × 200의 큐브
1로 초기화 한 3 차원 numpy 배열로 실험해 보겠습니다.
실제로 STL 파일을로드numpy-stl
를 사용하여 배열을 수행합니다.
(자세한 내용은 향후 집필 예정입니다)
박스 카운트 방법
박스 카운트법에 관해서는 여기의 기사를 알기 쉽다고 생각하므로, 링크를 붙여 주시겠습니다.
표면 거칠기 곡선의 프랙탈 분석
이것을 3 차원적으로 생각합니다.
1. 입방체를 격자 모양으로 분할
2. 격자 내에 물체가 포함되어 있으면 카운트
3. 격자의 변의 길이를 grid_size, 카운트수를 n으로 한다
4. log(grid_size)와 log(n) 플롯
5. 최소제곱법에 의한 선형회귀를 실시한다
6. 그 회귀 계수를 프랙탈 차원으로 한다
이 격자의 크기를 차례로 바꿉니다.
상자에 포함된 요소를 계산하는 함수
3차원 배열을 x방향→y방향→z방향의 순서로 주사
1의 판정은 np.any
3d_fractal.pydef count(arr, x, y, z, b):
i = j = k = 0
b_tmp = b
b_tmp2 = b
ct = 0
j_tmp = b
k_tmp = b
while k < z:
while j < y:
while i < x:
if (np.any(arr[i:b, j:j_tmp, k:k_tmp] == 1)):
ct += 1
i += b_tmp
b += b_tmp
# 折り返し
j += b_tmp2
j_tmp += b_tmp2
b = b_tmp2
i = 0
# 折り返し
k += b_tmp2
k_tmp += b_tmp2
b = b_tmp2
j = b_tmp2
i = 0
j = 0
main 함수
격자 크기를 200에서 1/2씩 100, 50, ... 과 1이 될 때까지 count()
의 처리를 반복합니다.
격자 크기가 1일 때의 카운트는 200×200×200 = 80,00,000이 되어야 합니다.
3d_fractal.pydef main():
x = y = z = 200
graph_x = []
graph_y = []
array3d = np.ones((x, y, z))
ct_1 = np.count_nonzero(array3d == 1)
grid_size = max(x, y, z)
while grid_size >= 1:
n = count(array3d, x, y, z, grid_size)
graph_x.append(math.log(grid_size))
graph_y.append(math.log(n))
print(grid_size, n)
print (math.log(grid_size), math.log(n))
grid_size = int(grid_size / 2)
선형 회귀
카운트한 결과로부터 선형 회귀를 실시합니다.
회귀 처리에는 scikit-learn
클래스sklearn.linear_model.LinearRegression
를 사용합니다.
3d_fractal.py graph_x = np.array(graph_x).reshape((len(graph_x), 1)) # 1列にする
graph_y = np.array(graph_y).reshape((len(graph_y), 1))
model_lr = LinearRegression()
# 予測モデル作成
model_lr.fit(graph_x, graph_y)
plt.xlabel("log(grid_size)")
plt.ylabel("log(n)")
plt.plot(graph_x, graph_y, 'o')
plt.plot(graph_x, model_lr.predict(graph_x), linestyle="solid")
plt.grid()
plt.show()
# フラクタル次元 = 回帰係数
fractal = model_lr.coef_[0][0] * -1
print("Fractal : ", fractal)
결과
이것은 결과의 로그 그래프입니다.
가로축에 격자 크기의 로그
세로축에 카운트수의 log
이 회귀 계수는 프랙탈 차원입니다.
200 1
5.298317366548036 0.0
100 8
4.605170185988092 2.0794415416798357
50 64
3.912023005428146 4.1588830833596715
25 512
3.2188758248682006 6.238324625039508
12 4913
2.4849066497880004 8.499640032168648
6 39304
1.791759469228055 10.579081573848484
3 300763
1.0986122886681098 12.614077858172898
1 8000000
0.0 15.89495209964411
Fractal : 3.004579190748091
결과는 다음과 같습니다.
프랙탈 차원은 3.004579190748091
그렇다면 거의 이론치입니다.
200에서 반복했을 때 25/2 = 12로 나눌 수없는 경우가 생겨 조금 어긋남이 나왔습니다.
요약
박스 카운트법에 관해서는 여기의 기사를 알기 쉽다고 생각하므로, 링크를 붙여 주시겠습니다.
표면 거칠기 곡선의 프랙탈 분석
이것을 3 차원적으로 생각합니다.
1. 입방체를 격자 모양으로 분할
2. 격자 내에 물체가 포함되어 있으면 카운트
3. 격자의 변의 길이를 grid_size, 카운트수를 n으로 한다
4. log(grid_size)와 log(n) 플롯
5. 최소제곱법에 의한 선형회귀를 실시한다
6. 그 회귀 계수를 프랙탈 차원으로 한다
이 격자의 크기를 차례로 바꿉니다.
상자에 포함된 요소를 계산하는 함수
3차원 배열을 x방향→y방향→z방향의 순서로 주사
1의 판정은
np.any
3d_fractal.py
def count(arr, x, y, z, b):
i = j = k = 0
b_tmp = b
b_tmp2 = b
ct = 0
j_tmp = b
k_tmp = b
while k < z:
while j < y:
while i < x:
if (np.any(arr[i:b, j:j_tmp, k:k_tmp] == 1)):
ct += 1
i += b_tmp
b += b_tmp
# 折り返し
j += b_tmp2
j_tmp += b_tmp2
b = b_tmp2
i = 0
# 折り返し
k += b_tmp2
k_tmp += b_tmp2
b = b_tmp2
j = b_tmp2
i = 0
j = 0
main 함수
격자 크기를 200에서 1/2씩 100, 50, ... 과 1이 될 때까지
count()
의 처리를 반복합니다.격자 크기가 1일 때의 카운트는 200×200×200 = 80,00,000이 되어야 합니다.
3d_fractal.py
def main():
x = y = z = 200
graph_x = []
graph_y = []
array3d = np.ones((x, y, z))
ct_1 = np.count_nonzero(array3d == 1)
grid_size = max(x, y, z)
while grid_size >= 1:
n = count(array3d, x, y, z, grid_size)
graph_x.append(math.log(grid_size))
graph_y.append(math.log(n))
print(grid_size, n)
print (math.log(grid_size), math.log(n))
grid_size = int(grid_size / 2)
선형 회귀
카운트한 결과로부터 선형 회귀를 실시합니다.
회귀 처리에는
scikit-learn
클래스sklearn.linear_model.LinearRegression
를 사용합니다.3d_fractal.py
graph_x = np.array(graph_x).reshape((len(graph_x), 1)) # 1列にする
graph_y = np.array(graph_y).reshape((len(graph_y), 1))
model_lr = LinearRegression()
# 予測モデル作成
model_lr.fit(graph_x, graph_y)
plt.xlabel("log(grid_size)")
plt.ylabel("log(n)")
plt.plot(graph_x, graph_y, 'o')
plt.plot(graph_x, model_lr.predict(graph_x), linestyle="solid")
plt.grid()
plt.show()
# フラクタル次元 = 回帰係数
fractal = model_lr.coef_[0][0] * -1
print("Fractal : ", fractal)
결과
이것은 결과의 로그 그래프입니다.
가로축에 격자 크기의 로그
세로축에 카운트수의 log
이 회귀 계수는 프랙탈 차원입니다.
200 1
5.298317366548036 0.0
100 8
4.605170185988092 2.0794415416798357
50 64
3.912023005428146 4.1588830833596715
25 512
3.2188758248682006 6.238324625039508
12 4913
2.4849066497880004 8.499640032168648
6 39304
1.791759469228055 10.579081573848484
3 300763
1.0986122886681098 12.614077858172898
1 8000000
0.0 15.89495209964411
Fractal : 3.004579190748091
결과는 다음과 같습니다.
프랙탈 차원은 3.004579190748091
그렇다면 거의 이론치입니다.
200에서 반복했을 때 25/2 = 12로 나눌 수없는 경우가 생겨 조금 어긋남이 나왔습니다.
요약
STL 파일에서 직접 프랙탈 차원을 계산하는 방법을 다음에 작성하고 싶습니다.
참고문헌
"표면 거칠기 곡선의 프랙탈 해석", 코노 타케로, (2010), 나가노 현 공기 센터 연구, No.
Reference
이 문제에 관하여(박스 카운트 법에 의한 프랙탈 차원 해석을 3 차원으로 해 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/JojiTsuboi/items/c0939ff02a5fc5b76279
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(박스 카운트 법에 의한 프랙탈 차원 해석을 3 차원으로 해 보았다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/JojiTsuboi/items/c0939ff02a5fc5b76279텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)