2018/4/11

聚类

k-means 聚类

聚类分析的代价函数:

J(c(1),,c(m),μ1,,μK)=1mi=1m||X(i)μ(i)c||2 J ( c ( 1 ) , ⋯ , c ( m ) , μ 1 , ⋯ , μ K ) = 1 m ∑ i = 1 m | | X ( i ) − μ c ( i ) | | 2

在式子中, c(i) c ( i ) 表示为离第i个样本最近的类的索引,取值范围[1,K]; μ1,μ2,,μk μ 1 , μ 2 , ⋯ , μ k 表示k个类的重心; μ(i)c μ c ( i ) 表示离第i个样本最近类即第 μ(i)c μ c ( i ) 个类的中心点。
使得下面的公式最小化:
minc(1),,c(m)μ1,,μKJ(c(1),...,c(m),μ1,...,μK) min c ( 1 ) , ⋯ , c ( m ) μ 1 , ⋯ , μ K J ( c ( 1 ) , . . . , c ( m ) , μ 1 , . . . , μ K )
//atop 在…顶上

k-means 的一个问题时,他可能会停留在一个局部最优处,这取决于初始化的情况

解决办法:多次运行K-means算法,每一次都是随机初始化,最后再比较多次运行的结果,选择代价函数 J() J ( ) 最小的结果。

聚类数的选择

  • 根据目标来选择
  • “肘部法则”,类的个数对应的点叫做“肘点”

降维(Dimensionality Reduction)

降维的原因是特征之间存在冗余

PCA(principal component analysis)

pca技术的有点是完全无参数限制的,降维只与数据有关,与用户无关;而恰恰这种优点也是它的缺点所在,当用户对观测对象有了一定的先验知识的时候,不能通过参数化等方法进行干预,可能得不到预期的效果。

pca,找到一个方向向量,k维(把n维数据压缩到k维数据),当把所有数据都投射到该向量之上,使得投射平均均方误差最小,也叫做是投射误差(projected error)。

pac算法步骤:

  • 将数据归一化,也就是标准化处理 [消除量纲带来的影响]
  • 计算协方差矩阵 Σ Σ
  • 计算协方差矩阵 Σ Σ 的特征向量
    在求解协方差矩阵 Σ Σ 的特征向量的时候会用到奇异值分解(sigular value decomposition)
    [U,S,V]=svd(Σ) [ U , S , V ] = s v d ( Σ )

    Σ=1mi=1m(x(i))(x(i))T Σ = 1 m ∑ i = 1 m ( x ( i ) ) ( x ( i ) ) T

U是一个具有与数据之间最小投射误差的方向向量构成的矩阵。从U中选取前K个向量得到一个n*k维度的矩阵,用 Ureduce U r e d u c e 表示–实际应用中要看原始数据矩阵的形式,是列是特征,还是行是特征–通过向量 Ureduce U r e d u c e 我们就可以对原始数据进行降维。

z(i)=UTreducex(i) z ( i ) = U r e d u c e T ∗ x ( i )

使用压缩后的数据可用来进行预测,预测值进行重建[reconstruction from compressed representation]即把数据从k维还原到n维。

x=Ureducez x = U r e d u c e ∗ z

主成分分析,其实就是对原始数据进行基变换,使得数据在新基(新的坐标系)下,某些基上方差很大,而在其余基上很小。达到用k个基却能表示原数据的绝大部分信息。而奇异值分解就能达到这个目的

奇异值分解:
https://blog.csdn.net/shenziheng1/article/details/52916278

python中数据的合并

pd.concat(objs, axis=0, join=’outer’, join_axes=None, ignore_index=False,keys=None, levels=None, names=None,verify_integrity=False,copy=True)

  • objs指定连接对象,可以是series , datafram
  • axis 指定连接是按照行(axis=1)还是按照列(axis=0)进行连接,默认是按照列合并
  • join默认为outer,表示并集,inner表示交集
    append()方法表示:横向和纵向同时扩充,不考虑columns和index
    pd.merge(left, right, how=’inner’, on=None, left_on=None, right_on=None,left_index=False, right_index=False, sort=True,suffixes=(‘_x’, ‘_y’), copy=True, indicator=False)

  • left左边连接对象

  • right 右边连接对象
  • left 左边的连接对象

dataframe.to_csv()
str()强制类型转换
extend()函数用于在列表末尾一次性追加另一个序列中的多个值;
ps:该方法没有返回值,但会在已存在的列表中添加新的列表内容。
aList = [123, 'xyz', 'zara', 'abc', 123]
bList =[2009, 'manni']
aList.extend(bList)
print(aList.extend(bList)) //输出值为None
print(aList) //输出值为[123, 'xyz', 'zara', 'abc', 123, 2009, 'manni', 2009, 'manni']

shape返回对象的维度,返回值类型是元组
c=np.array([[1,2],[2,3],[4,5],[6,5]])
print(c)
print(c.shape,c.shape[0],c.shape[1]) //(4,2) 4 2

np.load()和np.save() 用来保存Numpy专用的存取数据,数据类型为二进制类型保存数据。保存在后缀文件名.npy的文件中。

A=np.arange(15).reshape(3,5)
np.save("A.npy",A)
B=np.load("A.npy")
print(B)

to_csv() 和 read_csv()
g=[1,2,3]
h=[4,5,6]
d=pd.DataFrame({"g_name":g,"h_name":h})
d.to_csv("d.csv",sep=',',index=False)
huha=pd.read_csv("d.csv")
print(huha)

结果如下:
g_name h_name
0 1 4
1 2 5
2 3 6

DataFrame()
创建一个数据框,一个表格型的数据结构.
DataFrame(data,columns = [‘col0’,’col1’,’col2’]) 传入columns参数指定列的顺序
Series(data,index)
生成一维数组

append()
List.append(object)
函数没有返回值,只是在List对象最后面的元素追加为Object
注意appendextend的区别
h.append(g)
print(h)

结果:
[4, 5, 6, [1, 2, 3]]
del h[3]
h.extend(g) //extend函数用于在列表末尾一次性追加另一个序列中的多个值
print(h)

结果:
[4, 5, 6, 1, 2, 3]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值