感性工学Kansei Engineering是一种研究感性意象和产品特征的方法,经常用在产品造型风格分析、产品意象语义表达、产品情感化设计等过程。一个常规的流程是:
- 搜集感性意象(风格标签、感性词汇、草图、参考图等)
- 量化
- 制作产品展示(比如同一个产品的多种造型)和每个产品的意象评价问卷
- 数据分析(清洗、降维、聚类等)
- 降维的感性意象映射到设计特征
1 语义差分SD
量化
感性意象研究的基础。搜集目标领域的反义词对,比如前卫的-保守的
,然后分等级,比如2表示非常前卫,1表示前卫,0表示既不前卫也不保守,-1表示保守,-2表示非常保守。这种分级量表也是Likert表的一种,一般用5点或7点(等级)
调查、清洗
制作展示样本,针对N个词对,调查M个人,得到评价矩阵$X_{M\times N}$。于是对每个词对都可以算它们的均值方差。得到均值方差后应该去除坏值——根据莱依达准则,超出3方差的值对应的被调查者所给出的所有数据都需要删掉。
2 降维
因子分析
用少数几个因子去描述许多指标或因素之间的联系。将相关比较密切的几个变量归在同一类中,每一类变量就成为一个因子(不可观测量),以较少的几个因子反映原资料的大部分信息。举个例子,偏科各门成绩是可以观测的变量,但背后的因子如逻辑思维强就是不可观测的量。可见因子分析看重的是协方差。
不是所有的数据都可以做因子分析。这里需要先用KMO检验和Bartllet检验判断数据是否适合做因子分析。KMO比较变量的简单相关系数和偏相关系数。显然,变量越相关才越有做因子分析的必要。体现在数值上,KMO越大越适合做因子分析,<0.5则不适合。简单相关系数衡量了线性相关程度。Bartllet检验通过检验相关矩阵是否为单位阵来判断变量间是否独立。p值<0.05则适合做因子分析。
下面来说因子分析。既然M个变量$X_{M\times 1}$可以用N个因子$F_{N\times 1}$表示(N<M),那么X就可以写成F的函数$X=FA+E$。A称为因子载荷矩阵,从行上考虑,A衡量了每个变量在各因子上的投影;从列的角度来考虑,A衡量了每个因子对各变量的贡献。E称为特殊因子。F内部、E内部以及F和E都是不相关的,其中F中各因子方差均为1。因子分析就是求解A的过程。
定义A的列中各元素的平方和为因子对变量的贡献,实际上该值也是协方差矩阵的特征根之一。那么只要选择贡献度靠前的几个因子(一般选择累积贡献度>60%的几个因子),就可以完成初步的降维。
因子分析中还要通过因子旋转来增强解释性,即尽量使每个变量只在一个因子上有较大载荷,在其他因子上有较小载荷,这样该因子的含义就更容易明确。sklearn则通过from sklearn.decomposition import FactorAnalysis
使用因子分析,但因子数量需要人为指定。因此如果想要用累积贡献度的方法选择因子,需要查看因子和贡献度,手动筛选靠前的。SPSS中可以更好地完成因子分析,通过降维-因子分析
,并在旋转
中设置旋转方法,直接求得因子数量(默认累积贡献度>60%)和因子载荷矩阵。
PCA
和因子分析追求解释性不同,主成分分析着重考虑方差,且不关注解释性。具体来说,PCA是找到一个数据尽量有最大方差的低维映射。实现这个目的的思路还是比较容易想的:
- 数据标准化
- 求协方差矩阵
- 求协方差矩阵的特征值和特征向量
- 选择最大的几个特征值对应的特征向量(就是最大方差)
- 数据降维到选择出的特征向量所构造的空间中
为什么要最大方差呢?实际上PCA做的事情是找正交的主轴。比如一堆分布成椭圆形的点PCA降到1维,主轴就是椭圆的长轴。显然,数据点在椭圆长轴上的投影方差最大,数据点到椭圆长轴的均方误差最小(有点直线拟合的意思,只不过对误差的度量方法不太一样),这两个考量得到的结果是一致的。
在sklearn中通过引入from sklearn.decomposition import PCA
类、fit_transform()
方法使用PCA。主成分的数量可以通过PCA(n_component=...)
指定,一般可以传入float值而不是int值,这样就不需要考虑具体数量,只需要考虑降维后信息保留的百分比即可。但sklearn的因子分析不能这样设置,只能指定因子数量。
LDA
和PCA不同,线性判别分析LDA是一种有监督的降维方法。PCA其实不尽完美。比如两堆数据分别分布在两个长轴平行的椭圆区域内,如果长轴足够大,PCA给出的可能还是长轴方向,这样一投影,两度数据就不可分了。这时候LDA能找到它们的短轴方向。
因为数据带了标签,所以LDA的目标是:分类效果最好——降维后同类数据尽量近,不同类数据尽量远。为了实现这个目标,流程如下:
- 计算样本类间散度矩阵$S_b$
- 计算样本类内散度矩阵$S_w$
- 计算$S_w^{-1}S_b$的特征值和特征向量
- 取最大的几个特征值对应的特征向量
- 数据降维到选择出的特征向量所构造的空间中
LDA最多只能将数据降维到类别-1维。skearn中通过from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
使用LDA降维。LDA也可以直接用于分类,通过from sklearn.lda import LDA
使用LDA分类。
3 聚类分析
为了进一步增强解释性,将变量根据载荷矩阵进行聚类。因为已经有了因子分析的结果,知道因子数量,所以聚类数量就确定了。
K均值聚类
过程:
- 指定K个聚类中心点
- 遍历数据,每个数据计算和K个中心点的距离,归类到最近中心点的簇中
- 归类完毕后,对K簇点,每簇计算中心点,更新原来的聚类中心点
- 重复2-3,直到聚类中心点不再有大变动为止
sklearn中使用from sklearn.cluster import KMeans
引用K均值聚类,属性n_clusters
指定K,方法fit_predict(X)
进行聚类和预测。
K近邻(分类算法,不是聚类算法)
因为提到了K均值聚类,所以再复习下K近邻分类。K近邻的思想可以说朴素至极了,测试数据和训练数据计算距离,排序找出最近的K个训练数据,统计下属于哪类最多,测试数据就属于哪类。KNN没有显示的训练过程,属于“懒惰学习”,时间和空间复杂度都比较大。sklearn中通过sklearn.neighbors.KNeighborsClassifier
调用KNN分类器。
凝聚层次聚类
凝聚层次聚类是自底向上的聚类过程:
- 每个数据自成一类
- 计算数据点两两距离,合并最近的两个为一簇
- 计算簇两两距离,合并最近的两簇为一簇
- 重复3直到90%的点被合并
计算簇的两两距离有很多种准则,比如两簇的点的最小距离、最大距离、平均距离等等。sklearn中使用from sklearn.cluster import AgglomerativeClustering
调用凝聚层次聚类。
4 感性意象与设计特征的映射
最开始搜集到的感性词汇经过清洗、降维、聚类之后,得到了精简的若干个词对。于是就可以制定新一轮的测试,制作展示样本和意象评价表。有了调查结果就可以进行回归,得到映射关系。这个回归问题中,输入是设计特征,输出是量化的感性意象。不过这一步的关键倒不在于回归,而是设计特征的处理。因为不同的设计要素且不说尺度不一样需要归一化,连量化方式可能都要精心设计,原始数据未必好,传统的特征工程也未必能满足要求,可能还需要用到domain knowledge进行特征工程。比如样条曲线的量化,只靠控制点参数是不行的,要定义一个更高层级的语义特征,比如平均曲率、直线度等等来量化这个设计特征。
如果设计要素对感性词汇的影响存在非线性,这是线性回归捕捉不到的。可以考虑转化成分类问题用MLP做映射。但这样就需要比较多的样本,不然很容易过拟合。
以上只是设计要素到感性意象的分析/评价过程。如果想用意象指导设计,有以下若干种方法:
- 要素对每个感性词汇做映射,这样感性词汇变化时查找设计要素如何变化。这个方法自动化程度低,只适用于设计特征比较少、非线性度低的情况
- 既然回归建立了评价函数,实际上就可以将之作为适应度函数,使用遗传算法对输入特征进行优化求解,最终得到满足要求意象词汇的设计特征。
- 将上述过程反过来,输入量化的感性词汇,输出设计要素,做映射