BKM(Building Knowledge modlling) — 换个角度看BIM
今天我们将通过获取实际建筑BIM实例模型数据来展现机器学习算法在建筑设计当中可能的一个应用场景。根据一层楼的建筑面积,来确定这层楼的楼梯个数,本期仅做方法演示。
准备材料:Python3.7,Pycharm,MySQL数据库,BIM模型
将BIM模型数据导入到MySQL数据库,最好多几个,每个数据库命名规范点,比如作者使用了18个BIM模型(当然越多越好),这18个BIM模型其实是一个项目案例,是地面上部分,不包括楼顶,因为楼顶可能不上人也没有楼梯,也不包括地下室部分,一层。可利用的就是16个BIM模型。这16个BIM模型分为裙楼和塔楼部分,按照楼层分割成16个BIM模型。命名就是“bim_model_x”,x就是序号,以方便在代码中批量进行数据获取。
新建一个Python文件,名字为“dataDeal.py”主要用途是获取每个BIM模型中的楼梯的个数和建筑面积,在这里楼梯个数是很好取得的,建筑面积我们且用楼板面积代替。
(1)准备MySQL数据库外部包
在Pycharm命令行中使用pip install pymysql,安装访问MySQL的外部包,并使用以下代码导入包。
(2)创建所有数据库名称
def DBName():
name = []
for i in range(2,18):
tem_name = "bim_model_"+str(i)
name.append(tem_name)
return name
(3)定义要使用的SQL语句
_SQL=[
"""select * from 楼梯 """,
"""select * from 楼板"""
]
(4)定义一个数组求和函数,后面会用到
def list_sum(list=[]):
sum_value=0
for item in list:
sum_value=sum_value+item
return sum_value
(5)创建一个函数连接数据库,并执行SQL_order中的SQL语句
def DBconnetion():
area_data = []
stair_data=[]
for i in range(0,16):
conn = pymysql.Connect(host='localhost',user='root',passwd='root',database=DBName()[i])
cursor = conn.cursor()
for i in range(2):
cursor.execute(_SQL[i])
res = cursor.fetchall()
if(i==0):
area_data.append(res)
if(i==1):
stair_data.append(res)
cursor.close()
conn.close()
return [area_data,stair_data]
主要是每个BIM模型中的楼梯个数
def stair_count_deal():
stair_count = []
stair_tem_Datas = DBconnetion()[0]
count = 0
for item in stair_tem_Datas:
count+=1
stair_count.append(len(item))
print('stair_count_deal函数执行完毕')
return stair_count
运行结果:
[11, 11, 12, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
def area_data_deal():
area_count = []
area_tem_Datas = DBconnetion()[1]
value2 = []
for i in range(len(area_tem_Datas)):
value = []
for j in range(len(area_tem_Datas[i])):
value.append((area_tem_Datas[i][j][9]))
value2.append(value)
print(len(value2)) #应该是16才对
new_va = []
new_va2 = []
for va in value2:
new_va = []
for v in va:
if v !=None:
new_va.append(v)
new_va2.append(new_va)
print('\以下是new_va2')
for item in new_va2:
area_count.append(list_sum(item))
# print(area_count)
print('area_data_deal函数执行完毕')
area_data = []
for i in range(len(area_count)):
area_data.append([area_count[i]])
return area_data
运行结果:
[[12296.29107159122], [12396.977332842913], [12417.263322772962], [12089.141867935388], [3441.6865278642226], [3082.5091372103548], [3078.7783158060874], [3140.5610254878493], [3152.4177794946686], [3107.686589838284], [3111.108618866588], [3105.887295137192], [3111.380660995027], [4520.2662090285], [3129.6648769710255], [3055.531236410798]]
步骤二可参看24期,本期在上一期的基础上做了一些简单的改变。
新建一个Python文件,引用步骤一的dataDeal.py文件和机器学习算法文件和机器学习算法包。
from sklearn import svm
from dataDeal import stair_count,area
X_attribute = area
Y_lable = stair_count
clf = svm.SVC(C = 1.0, kernel='rbf', gamma=0.5)
clf.fit(X_attribute, Y_lable)
print("训练集的准确率为:",clf.score(X_attribute,Y_lable))
attr = [[12396],[12396.977332842913],[12296],[12089]]
result = clf.predict(attr)
print("\n %s预测结果是:%s"%(attr,result))
print("程序运行完毕")
运行结果:
[[12396], [12396.977332842913], [12296], [12089]]预测结果是:[ 2 11 11 8]
注意这里的属性集数据是一维的,按照机器学习算法的的特性,属性集的维度越高,数据越多,预测的结果就越精确。
欢迎加入Q群:427981585。
微信公众号【BIM技术应用交流】回复“25”获取本期资料。
知乎专栏【BIM学习心得】,获取更多脑洞应用。