🌓
搜索
 找回密码
 立即注册

BKM 25期—机器学习算法在建筑设计中回归应用实例

admin 2020-4-10 19:04:18 57235

BKM(Building Knowledge modlling) — 换个角度看BIM

今天我们将通过获取实际建筑BIM实例模型数据来展现机器学习算法在建筑设计当中可能的一个应用场景。根据一层楼的建筑面积,来确定这层楼的楼梯个数,本期仅做方法演示。

准备材料:Python3.7PycharmMySQL数据库,BIM模型



步骤一:准备数据



1.数据库BIM模型准备


BIM模型数据导入到MySQL数据库,最好多几个,每个数据库命名规范点,比如作者使用了18BIM模型(当然越多越好),这18BIM模型其实是一个项目案例,是地面上部分,不包括楼顶,因为楼顶可能不上人也没有楼梯,也不包括地下室部分,一层。可利用的就是16BIM模型。这16BIM模型分为裙楼和塔楼部分,按照楼层分割成16BIM模型。命名就是“bim_model_x”x就是序号,以方便在代码中批量进行数据获取。


 

2.数据库BIM数据获取


新建一个Python文件,名字为“dataDeal.py”主要用途是获取每个BIM模型中的楼梯的个数和建筑面积,在这里楼梯个数是很好取得的,建筑面积我们且用楼板面积代替。

1)准备MySQL数据库外部包

Pycharm命令行中使用pip install pymysql,安装访问MySQL的外部包,并使用以下代码导入包。

import pymysql.cursors

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]

3.取到楼梯数据


主要是每个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("总计%d个楼层数据"%(count))    print('stair_count_deal函数执行完毕')    return stair_count

运行结果:

[11, 11, 12, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]


4.提取面积数据

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期,本期在上一期的基础上做了一些简单的改变。


1.引入数据文件


新建一个Python文件,引用步骤一的dataDeal.py文件和机器学习算法文件和机器学习算法包。

from sklearn import svmfrom dataDeal import stair_count,area


2.使用机器学习算法

# 这里面积是属性值,楼梯个数是标签值X_attribute = areaY_lable = stair_countclf = 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学习心得】,获取更多脑洞应用。



扫码关注

更多精彩


扫一扫

101715.jpg
随机推荐

最新主题

0 回复

高级模式
游客
返回顶部